2008-11-28 17 views
0

我有一個抽象基類和派生類:我應該使用「虛擬」關鍵字的基礎類,這實際上是一個接口的析構函數?

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; 

我真的需要讓基類的析構函數虛擬,如C++或it`ll是確定的,如果它不是虛擬的?
順便說一下,我使用「覆蓋」的權利,或者我需要「超載」?

回答

3

覆蓋是正確的 - 您正在重新定義一個虛擬方法。

如果你真的想讓TInterfaceMethod的析構函數拋出EAbstractError,你必須將它標記爲'override;抽象;'。 (我很驚訝,它的工作原理,但我用D2007進行了測試,但確實如此。)但是,爲什麼要這麼做呢?

順便說一句,沒有必要爲每個聲明使用單獨的「類型」塊。您可以設置代碼的格式爲:

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; 

另外,你應該最有可能使用的接口,而不是一個抽象基類的。你應該像上面那樣標記TInterfaceMethod類的'abstract'。理論上,這會阻止你直接創建TInterfaceMethod對象。 (實際上,我的D2007允許 - 非常奇怪。)

1

只是爲了挑選;-)。

虛擬析構函數destroy已經存在(並被Free使用)。所以如果你聲明這樣的課程,你會遇到一些問題。

但是總結一些方法指令:

  • 虛擬用於定義一個虛擬方法(使用運行時綁定)。
  • 覆蓋用於定義覆蓋虛擬方法的方法。
  • 抽象與虛擬(或重寫!)一起使用來定義一個沒有實現的方法。它必須在子類中重寫,否則不能被調用。
  • final與virtual或override一起使用來定義不能被覆蓋的方法。
  • 如果您想重新引入已經存在於子類中的方法而不覆蓋它,則使用reintroduce。它抑制了你得到的警告。並照顧不需要的方法隱藏。
相關問題