Árvore de páginas

Versões comparadas

Chave

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

...

Portuguese
Section
A partir da versão 17.3.1.0 será possível sobrecarregar operadores. Isso é na definição da sua classe você poderá sobrecarregar o comportamento da Soma, da Subtração, da Multiplicação, da Divisão, da Comparação e da Conversão para String.




Bloco de código
languagecpp
firstline1
titleSobrecarga.tlpp
linenumberstrue
#include "msobject.ch"
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)
if (obj < obj2)
	conout("é menor")
endif
return



Resultado do Exemplo

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

Abrangência

17.3.1.0