2017-05-28 52 views
5

this問題你看到,可以創建一個抽象類添加abstract keywrod。我在Delphi中翻譯了一個項目,但我發現它允許創建一個抽象類。這是代碼:德爾福抽象類避免執行

type 
TCableSPF = class abstract 
    //code 
end; 

這是一個抽象類當然,我有很多實現它的子類。順便說一下,我看到有可能創建一個這樣的實例;

a := TCableSPF.Create; 

當我嘗試調用它的方法是虛擬和抽象的我得到的錯誤,這是確定的,但我可以防止類的創建?或者Delphi默認允許這個?感謝您的幫助

+1

這是一個已知問題:https://quality.embarcadero.com/browse/RSP-10235 –

+0

經過一些Google搜索後,我發現了一個選項'{$ WARN CONSTRUCTING_ABSTRACT ERROR}',但是,我看了一下[ RADStudio的東京文檔](http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Classes_and_Objects)(在由@SebastianProske顯示的鏈接中引用),並且不幸發現了以下注釋:「_Delphi允許實例化一個聲明爲抽象的類,爲了向後兼容,但不應該再使用此功能_「。 : -/ – silvioprog

回答

7

class abstract是從Delphi for .Net天保留。
由於未知原因,此關鍵字後面沒有(當前)實現。

如果您想阻止抽象類的實例化,則此關鍵字將無濟於事。相反,做到以下幾點:

type 
    TCableSPF = class abstract 
    //code 
strict protected 
    //Define all constructors for an abstract class as protected. 
    constructor Create; virtual; reintroduce; 
end; 

通過定義所有構造函數爲protected,只有派生對象可以訪問構造函數,其他代碼無法訪問的構造函數。
因爲你重新引入虛擬構造函數,你也可以不使用實例是:

unit A; 

type 
    TMyAbstractObject = class abstract(TObjectX) 
    strict protected 
    constructor Create; virtual; reintroduce; 
    end; 

... 
unit B; 

    TMyClass = class of TObjectX; 

    AbstractObjectInstance = TMyClass.Create; //Will not work for TMyAbstractObject 

請注意,您應該聲明構造override。取而代之的是聲明virtual reintroduce(或者如果你不想允許虛擬構造函數,只需要reintroduce)。

+0

非常感謝。這與C++所做的一樣,因爲它沒有abstract關鍵字。順便說一句,我必須使用我看到的解決方法。我希望他們會解決這個問題,因爲它很煩人:/ –

+0

爲什麼我應該重新引入而不是重寫?那是因爲抽象沒有實現的定義? –

+0

.net編譯器後面有一個實現。 –