Delphi — Class Operators
Vocês sabiam que há muito tempo, é possível alterar a forma como um operador trabalha no Delphi? Isso mesmo, este recurso permite a nós, alterarmos a forma como uma operação será executada. Mas como assim? Por exemplo, quando nós fazemos 1 + 1, estamos usando um operador de adição para somar dois números inteiros. Mas e se eu quisesse que ao escrever 1 + 1, ao invés de somar os dois números, ele subtraísse?
Class Operators
Bom, antes de mais nada, é preciso que você saiba que o exemplo acima teve fins didáticos, e que na prática, duvido muito que alguém inverteria o papel da adição rsrs. Então vamos lá… como eu já disse, os class operators existe na linguagem Delphi a muito tempo, só que até então eles eram específicos para os record types.
Com a evolução da tecnologia e a possibilidade do Delphi compilar para a arquitetura ARM, os class operators foram expandidos, tornando possível a sua aplicação em classes propriamente ditas.
Exemplo prático
Veremos na prática agora como utilizar esse recurso em nosso projeto. Para isso eu vou utilizar uma aplicação VCL compilando para o Windows. Portanto só podemos aplicar o class operator em records e não em classes.
Neste primeiro momento, vamos manipular o operador de adição. Criaremos um record chamado de TVenda, que terá apenas um atributo, sendo responsável por armazenar o valor da venda. Veja o código abaixo:
Supondo que nos gostaríamos de somar o valor de duas vendas, e apresentar o resultado para o usuário, teríamos que escrever algo como isto aqui:
Repare que para calcular a soma das duas vendas, somamos a propriedade “valor” de ambas as instâncias. Mas como ficaria isso então, utilizando o class operators? Bom, é muito simples! Basta realizar a sobrecarga do operador Add no nosso record, como mostra o código abaixo:
Veja que agora para calcular a soma das duas vendas, não somamos mais a propriedade “valor”, mas sim as próprias instâncias. Este é um exemplo bem simples, mas imagine que você queira somar várias propriedades de um record, seria bem mais fácil usando o class operator não é?
Implicit
O segundo class operator que nos vamos ver, é o implicit. Pra mim, um dos mais legais. Por exemplo, levando em consideração ainda o nosso record de vendas, vamos imaginar que nós temos uma variável do tipo string, contendo o valor da venda e queremos atribuir esse valor ao nosso record. Sendo assim, teríamos um código parecido com este aqui:
Bem simples não é mesmo? Mas veja agora, a mesma situação, porém usando o class operator implicit:
Bem mais simples não acha? Existem muitas linguagens que já utilizam do recurso implicit para fazer a tipagem de uma variável.
Nota: vale ressaltar, que você pode fazer uso de vários class operators em uma única classe ou record.
Inc
Outro recurso legal de trabalhar, é a utilização do class operator inc, onde temos a possibilidade de incrementar nossa instância da forma que bem entendemos. Por exemplo, vamos adicionar um novo atributo no nosso record de vendas, armazenando a quantidade de itens vendidos, e a cada item que for vendido vamos incrementar esse valor. Suponho que fazer isso sem o uso de class operators, vocês já sabem, portanto vou direto ao ponto:
Repare que se não fosse a utilização do class operator, ao compilar o projeto, certamente daria erro na linha 11 do código acima.
Equal
Para finalizar, vou apresentar a vocês o uso do class operator equal. Por exemplo, imaginemos que temos um record ou uma classe qualquer, que possua vários atributos, e nos temos duas instâncias dessas classes, onde nos precisamos verificar se essas instâncias são iguais. Como você faria? Percorreria atributo por atributo verificando os valores? Bom, veja que interessante quando nós implementamos o equal:
Agora em qualquer lugar do seu projeto que você quiser se as duas instâncias são iguais, basta comparar as próprias instâncias, e não seus atributos. Muito mais simples né?
Bom, este foi nosso último exemplo utilizando os class operators. Se você tiver interesse em conhecer outros tipos, acesse a documentação da Embarcadero e confira a lista completa.
Código fonte: GitHub
Referências: [Recursos do Delphi] Class Operator, Operator Overloading (Delphi) e Class Operators in Delphi