2010-12-14 103 views
5

Dans Delphi, étant donné les éléments suivants:Déterminez si Delphi ClassType hérite d'un autre ClassType?

TFruit = class; 
TFruitClass = class of TFruit; 

TApple = class(TFruit); 

TRedApple = class(TApple); 

Si j'ai une variable TFruitClass, comment puis-je savoir si elle hérite de TApple? Par exemple. dire que j'ai

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

Comment puis-je vérifier que FruitClass ne hérite en effet de TApple dans ce cas? L'utilisation de FruitClass is TApple ne fonctionne que pour les instances de classe.

+0

pourquoi? 'Assert (FruitClass.InheritsFrom (TApple))' –

Répondre

13

Utilisation InheritsFrom:

if TApple.InheritsFrom(TFruit) then 
    ... 

Vous pouvez également utiliser

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

Il convient de noter que la vérification du type d'exécution est souvent une incitation qu'un ou plusieurs [principes] (http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod) de la programmation orientée objet sont négligés (généralement une combinaison du principe de substitution de Liskov et du principe ouvert/fermé). David devrait considérer une conception qui n'exige pas que l'appelant sache quel descendant de 'TFruit' il appelle. –

+0

@codeelegance: même si je suis tout à fait d'accord avec vous, il y a toujours des compromis de conception. Et parfois vous avez juste besoin d'une méthode pour prendre n'importe quel TObject, pour adapter "interface" ou pour autoriser les paramètres de var et voulez toujours être certain que l'instance transmise est du type correct. Dans ces cas bien que je mets habituellement le InheritsFrom dans un Assert ... –

+0

NFI, mais cette réponse n'est pas correcte;) – PatrickvL

0

Je suppose que vous passez la variable FruitClass le long une certaine méthode, dans ce cas, votre devrait lire:

if FruitClass.InheritsFrom(TApple) then 

Notez que vous n'avez même pas besoin de tester nil, car InheritsFrom est une fonction de classe, et donc n ot besoin de la variable Self à affecter.