TLPP - LANGUAGE
Assim como em outras linguagens modernas, TLPP permite que uma aplicação estabeleça um comportamento particular para operações entre dois objetos.
Isso significa que tendo dois objetos, obj1 e obj2, por exemplo, pode-se realizar operações do tipo:
obj1 + obj2
obj1 - obj2
obj1 * obj2
obj1 / obj2
obj1 == obj2
Adicionalmente, também é possível oferecer uma string resultante quando um objeto for empregado em contexto textual, como, por exemplo, fazer um conout do objeto: conout(obj1).
Isso significa que tendo dois objetos, obj1 e obj2, por exemplo, pode-se realizar operações do tipo:
obj1 + obj2
obj1 - obj2
obj1 * obj2
obj1 / obj2
obj1 == obj2
Adicionalmente, também é possível oferecer uma string resultante quando um objeto for empregado em contexto textual, como, por exemplo, fazer um conout do objeto: conout(obj1).
A sintaxe de sobrecarga reserva a palavra OPERATOR para esse propósito, sendo antecedida de ADD, SUB, MULT, DIV, COMPARE ou TOSTRING, naturalmente conduzindo à uma das sobrecargas mencionadas acima.
Assim sendo, não é permitido que o nome do método seja iniciado com o prefixo "operator".
Sobrecarga.tlpp
#include "tlpp-core.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 objetos do tipo ComplexNumber 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 If (self:a > parm1:a .OR. self:b > parm1:b) Return 1 EndIf If (self:a < parm1:a .OR. self:b < parm1:b) Return -1 EndIf Return 0 Operator ToString() class ComplexNumber Return cValtoChar(self:a) + " + " + cValToChar(self:b) + "i" Function U_ComplexNumber() 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("Eu vi que o primeiro objeto é menor do que o segundo") EndIf Return
Resultado do Exemplo
4 + 6i
-2 + -2i
-5 + 10i
0.44 + 0.08i
Eu vi que o primeiro objeto é menor do que o segundo
Visão Geral
Import HTML Content
Conteúdo das Ferramentas
Tarefas