Saber o ancestral da classe

Delphi

12/07/2005

Eu tenho algumas classes registradas no sistema.

Elas são organizadas da seguinte forma:
TFilho = class(TPai)
TNeto = class(TFilho)


Então eu declaro types
TFilhoClass = class of TFilho;


Na minha factory eu executo
var
  oClass: TFilhoClass;
begin
  oClass := TFilhoClass(GetClass(AClasse));


Agora a pergunta: eu gostaria de saber se a classe que eu achei é descente direto de TFilho ou de TPai?
Operadores como ´oClass is TFilho´ não funcionam.

Desde já obrigado.


Andremuller

Andremuller

Curtidas 0

Respostas

Ronaldo

Ronaldo

12/07/2005

Dá uma estudada neste exemplo:

procedure TForm1.Button1Click(Sender: TObject);
var
ClassRef: TClass;
begin
ListBox1.Clear;
ClassRef := Sender.ClassType;
while ClassRef <> nil do
begin
ListBox1.Items.Add(ClassRef.ClassName);
ClassRef := ClassRef.ClassParent;
end;
end;


GOSTEI 0
Beppe

Beppe

12/07/2005

Opa!

O método InheritsFrom(C) não precisa de uma instância.

if C.InheritsFrom(SuaClasse) then


GOSTEI 0
Kapak

Kapak

12/07/2005

Operadores como ´oClass is TFilho´ não funcionam.
Pq não funciona ? Se ele retorna false é pq oClass não é TFilho.


GOSTEI 0
Andremuller

Andremuller

12/07/2005

não funciona porque oClass não é um objeto, é uma referência para uma class TFilhoClass que tá declarada no type.

Vou testar o InheritsFrom e depois posto o resultado no fórum

Valeu pessoal

Operadores como ´oClass is TFilho´ não funcionam. Pq não funciona ? Se ele retorna false é pq oClass não é TFilho



GOSTEI 0
Kapak

Kapak

12/07/2005

Tá certo o operador não é aplicável. E se fizer:
  if oClass = TFilho then
  ...
?


GOSTEI 0
Andremuller

Andremuller

12/07/2005

também não dá porque a factory não conhece todas as classes que cria, todas as classes criadas não estão declaradas na uses.
Ela cria um monte de classes, algumas descentes de TPai e outras descentendes de TFilho.

pra fazer o que tu disse que teria que fazer, em alguns casos

Digamos o seguinte
TNeto´X´ = class(TFilho)
TFilho´X´ = class(TPai)

if oClasse = TNeto1 ...
else
if oClasse = TNeto2 ....
else
if oClasse = TFilho1

isso seria inviável


GOSTEI 0
Kapak

Kapak

12/07/2005

Mas se for utilizar o InheritsFrom, também não precisa colocar no uses ?
Outra opção seria usar a propriedade ClassName de oClass:
if SameText(oClass.ClassName, ´classex´) then


GOSTEI 0
Andremuller

Andremuller

12/07/2005

Class name gera o mesmo problema do oClass = TFilho, eu teria que escrever todas as classes lá, o que não dá.

Meu problema é resolvido com o inheritsFrom

Valeu, pessoal


GOSTEI 0
Beppe

Beppe

12/07/2005

O ´uses´ é um recurso de compile-time, InheritsFrom é run-time, pode tudo.


GOSTEI 0
POSTAR