2010-12-14 14 views
5

In Delphi, dato il seguente:Scopri se Delphi ClassType eredita da altri ClassType?

TFruit = class; 
TFruitClass = class of TFruit; 

TApple = class(TFruit); 

TRedApple = class(TApple); 

Se ho una variabile TFruitClass, come posso scoprire se eredita da TApple? Per esempio. dire che ho

var 
    FruitClass: TFruitClass; 
... 
FruitClass := TRedApple; 

Come posso verificare che FruitClass effettivamente eredita da TApple in questo caso? L'utilizzo di FruitClass is TApple funziona solo per le istanze di classe.

+0

perché? 'Assert (FruitClass.InheritsFrom (TApple))' –

risposta

13

Uso InheritsFrom:

if TApple.InheritsFrom(TFruit) then 
    ... 

È inoltre possibile utilizzare

var 
    Fr: TFruitClass; 
    X: TObject; 
begin 
    if X.InheritsFrom(TFruit) then 
    Fr := TFruitClass(X.ClassType); 
end; 
+0

Va notato che il controllo del tipo di runtime è spesso un indizio che uno o più [principi] (http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod) di programmazione orientata agli oggetti vengono trascurati (di solito una combinazione del principio di sostituzione di Liskov e del principio di apertura/chiusura). David dovrebbe prendere in considerazione un design che non richiede che il chiamante sappia quale discendente di 'TFruit' sta chiamando. –

+0

@codeelegance: anche se sono d'accordo con tutto il cuore con te, ci sono sempre dei compromessi sul design. E a volte hai solo bisogno di un metodo per prendere qualsiasi TObject, per adattare "interfaccia" o per consentire i parametri var e comunque vuoi essere certo che l'istanza passata sia del tipo corretto. In questi casi, anche se di solito inserisco l'InheritsFrom in un Assert ... –

+0

NFI, ma questa risposta non è corretta;) – PatrickvL

0

presumo si passa la variabile FruitClass insieme a qualche metodo, nel qual caso il vostro dovrebbe leggere:

if FruitClass.InheritsFrom(TApple) then 

Nota che non hai nemmeno bisogno di eseguire il test per nil, poiché InheritsFrom è una funzione di classe, e quindi n o bisogno della variabile Self da assegnare.

Problemi correlati