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