Fórum Como saber se um método Abstrado foi implementado no Filho? #279076

27/04/2005

0

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

Responder

Posts

27/04/2005

Massuda

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.


Responder

Gostei + 0

27/04/2005

Marco Salles

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


Responder

Gostei + 0

27/04/2005

Yallebr

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.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar