2016-06-14 12 views
-1

抽象クラスを継承する複数のクラスがあります。私はすべての子クラスのための一般的な基本クラスの1つのメソッドを作成しました。すべての子クラスが強制的にそのメソッドを呼び出すようにします。そうでなければ、コンパイルエラーが表示されるはずです。子から基本メソッドを強制的に呼び出す方法

どうすれば実現できますか?

+3

現在のコードを表示できますか? – fubo

+2

コードなしで推測するのは難しいですが、メソッド_を呼び出すのではなく、コンパイラエラーとは思えません。 –

+2

メソッドはいつ呼び出されるべきですか?作成中に呼び出される必要がある場合、基本クラスは必要なコンストラクターのみを公開する必要があります。それ以外の場合は、基本クラスに公開されたメソッドがある場合は論理を反転し、すべての継承者が実装する抽象メソッドを呼び出します。 –

答えて

1

基本クラスのコンストラクタで呼び出しを行います。もちろん

public abstract class Base 
{ 
    protected Base() 
    { 
     //.... 
     mandatoryMethod(); 
    } 

    private void mandatoryMethod() { ... } 

    public abstract Foo Frob(); 
} 

public class Derived: Base 
{ 
    public Derived(....) 
    { 
     //new Base() will have been called when execution reaches this point. 
    } 

    public override Foo Frob() { ... } 
} 

これはいくつかの制限があります:

  1. からMandatoryMethodニーズ場合は必須メソッドは常にオブジェクトの作成時に呼び出されることが保証されているように、任意の派生オブジェクト基底クラスのコンストラクタを呼び出す必要がありますDerivedのコンストラクタの実行が終了した後に呼び出されると、これは機能しません。
  2. 「強制呼び出し」とは、Derivedメソッドを呼び出す前にMandatoryMethodを呼び出すことを意味しますが、これは機能しません。これを強制する方法はありません。あなたがすべての消費者のコードを所有している場合や、そうでない場合は要件を変更する場合は、唯一の選択肢はコードレビューです。

コンパイラの仕事は法的コードをコンパイルし、違法コードを禁止することです。 で定義されている任意のメソッドをDerivedから呼び出すことについては違法ではありません。これはアプリケーションのロジック要件であり、言語要件ではありません。コンパイラでこれを強制することはできません。最も近いのはコンストラクタソリューションを使用することです。コンパイラでは、Derivedオブジェクトを構築するときに、常にMandatoryMethodが常に呼び出されることが保証されています。

+0

'abstract'クラスのインスタンスコンストラクタ(' public Base() ')はpublicであってはいけません。 'new Base()'をどこにでも置くことができないので、publicにするのはちょっと混乱します。コンストラクタの使用はクラスを派生させて連鎖することだけです。この場合、 'protected Base()'と言うのは普通です。 –

+0

@JeppeStigNielsen非常に真実!この問題を解決しました。 – InBetween

+0

ありがとうございました。 –

関連する問題