Como saber se um método Abstrado foi implementado no Filho?

Delphi

27/04/2005

Olá pessoal,


Como faço para saber se um método abstrado foi implementado? Ou nem mesmo precisa ser abstrado. Queria fazer assim.

Se o filho implementou tal método então executa o método do filho, senão executa o método padrão do pai.

Ficou claro?

Obrigado. 8)


Yallebr

Yallebr

Curtidas 0

Respostas

Massuda

Massuda

27/04/2005

Se o filho implementou tal método então executa o método do filho, senão executa o método padrão do pai.
Talvez eu não tenha entendido direito, mas acho que seria suficiente declarar o método como sendo virtual apenas e ter a implamentação padrão na classe pai.


GOSTEI 0
Marco Salles

Marco Salles

27/04/2005

Como faço para saber se um [b:5c4672ec04]método abstrado [/b:5c4672ec04]foi implementado?
Se o filho implementou tal método então executa o método do filho, senão executa o método padrão do pai.


Se o método foi definido com [b:5c4672ec04]abstract [/b:5c4672ec04]na classe pai , ele ao ao ser [b:5c4672ec04]chamado[/b:5c4672ec04] por um objeto que faz [b:5c4672ec04]referencia ao Pai [/b:5c4672ec04], voce obtera um [b:5c4672ec04][color=darkred:5c4672ec04]Erro[/color:5c4672ec04][/b:5c4672ec04]
[b:5c4672ec04]Constructing instance of <nome da classe> containing abstract methods.[/b:5c4672ec04]

Em outras palavras , Aa directiva abstract é usada para declarar métodos que serão definidos apenas em subclasses da classe Pai


:arrow: [b:5c4672ec04]Agora a outra interpretação é :[/b:5c4672ec04]
Para o Filho implementar algum método diferente do método definido pela classe pai , este mesmo método tem que [b:5c4672ec04]ter[/b:5c4672ec04] a directiva [b:5c4672ec04]Virtual ou Dynamic [/b:5c4672ec04]na classe Pai e ter a directiva [b:5c4672ec04]override[/b:5c4672ec04] na classe Filho

[b:5c4672ec04]Mais uma interpretação[/b:5c4672ec04]:Se o filho implementou tal método então sera sempre executado , se o objeto criado [color=darkred:5c4672ec04][b:5c4672ec04]for uma instancia [/b:5c4672ec04][/color:5c4672ec04]da classe[b:5c4672ec04] Filho[/b:5c4672ec04],
se o objeto criado , for uma [color=darkred:5c4672ec04][b:5c4672ec04]instancia da classe pai [/b:5c4672ec04][/color:5c4672ec04]o método chamado , sera o da classe [b:5c4672ec04]Pai[/b:5c4672ec04]

É Claro que a variavel criada tem que ser do tipo da classe pai..

Var
 Objeto : TPai
begin
//pelo simples fato de que as duas chamadas a seguir são válidas
objeto:=TPai.Create
Objeto:=TFilho.Create;


Agora se a Variavel for do Tipo
var
 objeto:TFilho;
begin
Objeto:=TPai.Create --->>> isto é um erro


Com regra geral, voce pode usar um objeto da classe descendente , sempre que um objeto da classe ancestral for esperado, entretando o inverso não é válido


Para finaliZar voce pode usar o [b:5c4672ec04]Osperadore <IS> e <As>[/b:5c4672ec04] para obter informaççoes em tempo de execução da referencia do objeto

//definido como sendo Override na claase pai sera Executado
if objeto is TPai Then
  objeto.MetodoPai executado

//definido como sendo Overload na classe filho sera executado
if Objeto is TFilho
  Objeto.MetodoFilho 


p:s o uso desgorvenado dos operadores RTTI , é considerada uma prática ruim em programação


GOSTEI 0
Yallebr

Yallebr

27/04/2005

Massuda e Marco Salles,


Obrigado. Realmente acho que estou tentando fazer uma coisa simples de maneira complicada.
Declarei um método como virtual. Dessa forma eu do um override para sobre por no filho e faço a implementação da forma de desejar.


GOSTEI 0
POSTAR