1

私は次の継承を持っています:

class A
{
    void Configure(object param1) {...};
}

class B : A
{
    void Configure(object param1) {...}; // The method is not defined in B, it is available from the base class. This is just the desired interface of class B
}

class C : A
{
    void Configure(object param1, object param2) {...};
}

この場合、オブジェクトが不完全なままになるため、クラスCにparam1を使用したConfigureを表示させたくありません。

オーバーライドしようとしましたが、オーバーライドしても可視性を変更できません。

私が見つけた唯一のアプローチは、クラスAメソッドprotected void ConfigureBase(object param1) {...};を呼び出し、クラスBのメソッドConfigureをConfigureBaseに呼び出すことです。

各クラスで再定義するため、この設計に完全に満足しているわけではないので、Configureはこれを処理する標準的な方法がありますか?

4

2 に答える 2

5

これは不可能です。メソッドに例外をスローさせて使用できないようにすることもできますが、プログラミングにおける継承の基本原則の1つは、子を常に親の型であるかのように扱うことができるということです。次は何をすべきか:

A obj = new C();

obj.Configure(new object());//should this work, or not?

設計上、親ができることを子供ができないように制限する方法はありません。C本当にメソッドにアクセスできない場合は、プログラムをより根本的に再設計する必要がありますConfigure(object obj)。これは、C実際には拡張すべきではないことを意味する可能性がありますA(両方にとって意味がありAC共通のインターフェースを実装することは理にかなっているかもしれません)Configure。詳細を知らなければ、代替案を提案するのは難しいです。

于 2012-10-23T20:13:23.463 に答える
2

これを処理する標準的な方法はありますか?

はい:構成プロセスを初期化の一部にします。

公開する代わりにConfigure、コンストラクターですべての初期化を実行します。これにより、クラスは意味のある選択肢のみを公開できます。

class A {
    public A(object param1) {...};
}

class B : A {
    public B(object param1) : base(param1) {...}; // This re-exposes A's constructor
}

class C : A {
    // Note that A(param1) constructor is not available, even though C inherits A
    public C(object param1, object param2) : base(param1)  {...};
}
于 2012-10-23T20:14:12.977 に答える