A partir da versão 19.3.1.0 será possível sobrecarregar operadores. Isso é na definição da sua classe você poderá sobrecarregar o comportamento da Soma (ADD), da Subtração (SUB), da Multiplicação (MULT), da Divisão (DIV), da Comparação (COMPARE) e da Conversão para String (TOSTRING).
Não é permitido declarar operadores que não sejam os citados acima, ou seja, os tokens add, sub, mult, div, compare e tostring fazem parte da linguagem e só eles poderão ser utilizados.
Não é permitido declarar métodos cujo nome inicie com "operator".
Sobrecarga.tlpp
#include "tlpp-object.th" class ComplexNumber public data a public data b public method new() public method create(parm1, parm2) public OPERATOR Add (parm1) public OPERATOR Sub(parm1) public OPERATOR Mult(parm1) public OPERATOR Div(parm1) public OPERATOR Compare(parm1) public OPERATOR ToString() endclass method new() class ComplexNumber return self method create(parm1, parm2) class ComplexNumber self:a := parm1 self:b := parm2 return self //esse será o método invocado ao executar a soma de um objeto do tipo ComplexNumber com qualquer outro tipo operator Add(parm1) class ComplexNumber local ret := ComplexNumber():New() ret:a := self:a + parm1:a ret:b := self:b + parm1:b return ret operator Sub(parm1) class ComplexNumber local ret := ComplexNumber():New() ret:a := self:a - parm1:a ret:b := self:b - parm1:b return ret operator Mult(parm1) class ComplexNumber local ret := ComplexNumber():New() ret:a := self:a * parm1:a - (self:b * parm1:b) ret:b := (self:a * parm1:b) + (self:b * parm1:a) return ret operator Div(parm1) class ComplexNumber local conj := ComplexNumber():New() local ret := ComplexNumber():New() // Conjugado do denominador conj:a := parm1:a conj:b := - parm1:b // Multipica numerador e denominador pelo conjugado ret := self * conj conj := parm1 * conj // Divide o resultado da multiplicacao do numerador pela parte real do denominador ret:a := ret:a / conj:a ret:b := ret:b / conj:a return ret operator Compare(parm1) class ComplexNumber //retorna -1 se for menor, 0 se for igual e 1 se for maior if (self:a > parm1:a) return 1 endif if (self:a < parm1:a) return -1 endif if (self:b > parm1:b) return 1 endif if (self:b < parm1:b) return -1 endif return 0 operator ToString() class ComplexNumber return cValtoChar(self:a) + " + " + cValToChar(self:b) + "i" user function exemploComplex() local obj := ComplexNumber():Create(1, 2) local obj2 := ComplexNumber():Create(3, 4) local objRet objRet := obj + obj2 conout(objRet) objRet := obj - obj2 conout(objRet) objRet := obj * obj2 conout(objRet) objRet := obj / obj2 conout(objRet) if (obj < obj2) conout("é menor") endif return
Resultado do Exemplo
4 + 6i
-2 + -2i
-5 + 10i
0.44 + 0.08i
É menor
Abrangência
19.3.1.0
Visão Geral
Import HTML Content
Conteúdo das Ferramentas
Tarefas