2008-11-28 14 views
0

J'ai une classe de base abstraite et classe dérivée:Dois-je utiliser un mot-clé "virtuel" pour destructeur de classe de base qui est en fait une interface?

type TInterfaceMethod = class 
    public 
    destructor Destroy; virtual; abstract; 
    procedure Calculate; virtual; abstract; 
    procedure PrepareForWork; virtual; abstract; 
end; 
type ConcreteMethod = class(TInterfaceMethod) 
    private 
    matrix: TMinMatrix; 
    public 
    constructor Create(var matr: TMinMatrix); 
    procedure Calculate; override; 
    procedure PrepareForWork; override; 
    destructor Destroy; 
end; 

Ai-je vraiment besoin de faire destructor la classe de base virtuelle, comme en C++, ou `ll être OK si ce n'est pas virtuel? A propos, ai-je utilisé "override" à droite ou j'ai besoin de "surcharge"?

Répondre

3

Le remplacement est correct - vous redéfinissez une méthode virtuelle.

Si vous voulez vraiment que le destructeur de TInterfaceMethod lance EAbstractError, vous devrez le marquer comme 'override; abstrait;'. (Je suis surpris que cela fonctionne, mais j'ai testé avec D2007 et il le fait.) Mais pourquoi voudriez-vous faire cela?

Par ailleurs, il n'est pas nécessaire d'utiliser un bloc 'type' séparé pour chaque déclaration. Vous pouvez formater le code comme que:

type 
    TInterfaceMethod = class abstract 
    public 
    destructor Destroy; override; abstract; 
    procedure Calculate; virtual; abstract; 
    procedure PrepareForWork; virtual; abstract; 
    end; 

    TConcreteMethod = class(TInterfaceMethod) 
    private 
    matrix: TMinMatrix; 
    public 
    constructor Create(var matr: TMinMatrix); 
    procedure Calculate; override; 
    procedure PrepareForWork; override; 
    destructor Destroy; override; 
    end; 

Plus vous devriez probablement utiliser les interfaces au lieu d'une classe de base abstraite. Et vous devriez marquer la classe TInterfaceMethod 'abstract' comme ci-dessus. En théorie, cela vous empêcherait de créer directement un objet TInterfaceMethod. (En pratique, mon D2007 le permet - bizarre.)

1

Juste pour nitpick ;-).

Le destructeur virtuel destroy existe déjà (et est utilisé par Free). Donc, si vous déclarez une classe comme celle-ci, vous aurez quelques problèmes.

Mais pour résumer quelques directives de la méthode:

  • virtuel est utilisé pour définir une méthode virtuelle (utilise la liaison d'exécution). Override est utilisé pour définir une méthode qui remplace une méthode virtuelle.
  • abstract est utilisé avec virtual (ou override!) Pour définir une méthode sans implémentation. Il doit être surchargé dans une sous-classe sinon il ne peut pas être appelé. Final est utilisé avec virtual ou override pour définir une méthode qui ne peut pas être surchargée.
  • est utilisé reintroduce si vous voulez réintroduire une méthode qui est déjà dans une sous-classe sans elle remplaçant. Il supprime l'avertissement que vous recevez. Et prend soin de cacher la méthode non désirée.