Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

Estado
subtletrue
colourGreen
titletlpp - language

Composition Setup
import.css=/download/attachments/327912/newLayout.css
Portuguese
Section
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).

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
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".



Bloco de código
languagecpp
firstline1
titleSobrecarga.tlpp
linenumberstrue
#include "tlpp-objectcore.th"

classClass 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

methodMethod new() class ComplexNumber

returnReturn self

methodMethod create(parm1, parm2) class ComplexNumber
	   self:a := parm1
	   self:b := parm2
returnReturn selfSelf


//esse Esse será o método invocado ao executar a soma de umobjetos objeto do tipo ComplexNumber com qualquer outro tipo
operator
Operator Add(parm1) class ComplexNumber
	local   Local ret := ComplexNumber():New()
	   ret:a := self:a + parm1:a
	   ret:b := self:b + parm1:b
returnReturn ret

operatorOperator Sub(parm1) class ComplexNumber
	local   Local ret := ComplexNumber():New()
	   ret:a := self:a - parm1:a
	   ret:b := self:b - parm1:b
returnReturn ret


operatorOperator Mult(parm1) class ComplexNumber
	local   Local ret := ComplexNumber():New()
	   ret:a := self:a * parm1:a - (self:b * parm1:b)
	   ret:b := (self:a * parm1:b) + (self:b * parm1:a)
returnReturn ret

operatorOperator Div(parm1) class ComplexNumber
	local
   Local conj := ComplexNumber():New()
	local   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
Return ret

operatorOperator Compare(parm1) class ComplexNumber
//retorna -1 se for
 menor, 0 se for igual e 1 se for maior
	if If (self:a > parm1:a)
		return 1
	endif
	if (self:a < .OR. self:b > parm1:ab)
		return -1
	endif
	if      Return 1
   EndIf

   If (self:ba >< parm1:b)
		return 1
	endif
	if (a .OR. self:b < parm1:b)
		return      Return -1
	endif
return   EndIf

Return 0

operatorOperator ToString() class ComplexNumber
returnReturn cValtoChar(self:a) + " + " + cValToChar(self:b) + "i"

user function exemploComplexFunction U_ComplexNumber()
local   
   Local obj  := ComplexNumber():Create(1, 2)
local   Local obj2 := ComplexNumber():Create(3, 4)
local   Local objRet
   
   objRet := obj + obj2
conout   Conout(objRet)
   
   objRet := obj - obj2
conout   Conout(objRet)
   
   objRet := obj * obj2
conout   Conout(objRet)

   objRet := obj / obj2
conout   Conout(objRet)

if   If (obj < obj2)
	      conout("Eu vi que o primeiro objeto é menor do que o segundo")
endif   EndIf
return
Return


Resultado do Exemplo

4 + 6i
-2 + -2i
-5 + 10i
0.44 + 0.08i
É menor

Abrangência

19.3.1.0Eu vi que o primeiro objeto é menor do que o segundo