2017-05-28 16 views
5

thisの質問では、abstract keywrodを追加して抽象クラスを作成することができます。私はDelphiでプロジェクトを翻訳していますが、抽象クラスの作成が可能です。これはコードです:Delphi抽象クラスの実装を避ける

type 
TCableSPF = class abstract 
    //code 
end; 

は、これは当然の抽象クラスであり、私はそれを実装するサブクラスの多くを持っています。私はそれがこのようなインスタンスを作成することが可能であることがわかります。私は、仮想および抽象的で、そのメソッドを呼び出すしようとすると

a := TCableSPF.Create; 

私はエラーを取得し、これはOKですが、私はクラスの作成を防ぐことができますか?またはDelphiではデフォルトでこれを許可していますか?助けをありがとう

+1

これは既知の問題です:https://quality.embarcadero.com/browse/RSP-10235 –

+0

グーグルでは、{$ WARN CONSTRUCTING_ABSTRACT ERROR} 'オプションを見つけましたが、私は[ RADStudioの東京のドキュメント](http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Classes_and_Objects)(@SebastianProskeのリンクで参照されています)、残念ながら次のようなメモがあります。 "_Delphiでは、下位互換性のために、この機能はもう使用すべきではありません。 : -/ – silvioprog

答えて

7

class abstractDelphi for .Net日からホールドオーバーです。
理由が不明なため、このキーワードの背後には(現在の)実装はありません。

抽象クラスのインスタンス化を防止する場合は、このキーワードは役に立ちません。代わりに、次の操作を行います。

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

コンストラクタにアクセスすることができ、保護、唯一の子孫オブジェクトとしてすべてのコンストラクタを定義することにより、他のコードは、コンストラクタにアクセスすることはできません。あなたは仮想コンストラクタを再導入するので
は、あなたも使用して、それをインスタンス化することはできません:あなたはコンストラクタoverrideを宣言しないすべき

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 

注意を。代わりにvirtual reintroduceを宣言してください(仮想コンストラクタを許可したくない場合はreintroduce)。

+0

ありがとうございます。これは、C++が抽象的なキーワードを持たないために行うのと同じことです。 Btw、私は私が参照する回避策を使用する必要があります。私は彼らが迷惑であるためにこれを修正することを願っています:/ –

+0

なぜ再導入して上書きしないのですか?それは、抽象化が実装されていないという定義ですか? –

+0

.netコンパイラの後ろに実装がありました。 –

関連する問題