0

すべてのプライベートおよびパブリックの属性とメソッドはその親クラスから子クラスに継承されるので、コンストラクターとデストラクタが子クラスに継承されるのはなぜですか?

実際のシナリオはありますか?

4

1 に答える 1

1

ほとんどのプログラミング言語では、コンストラクターとデストラクターは自動的に継承されません。通常、基本クラスはコンストラクターの 1 つのセットを提供でき、子クラスはコンストラクターの別のセットを提供できます。

ほとんどの場合、抽象派生クラスは基本クラスと同じコンストラクターのセットを提供する必要があると思います(つまり、基本クラスからコンストラクターを「継承」します)が、具体的な派生クラスは基本クラスのコンストラクター引数の一部を解決し、より使いやすい一連のコンストラクタ:

次のケースを考えてみましょう。エンドポイント名として文字列を必要とする BaseWCFProxy という基本クラスがあるとします。

abstract class BaseWCFProxy 
{
  public BaseWCFProxy(string endpointName)
  {}
}

class ConcreteProxy : BaseWCFProxy
{
  public ConcreteProxy() : base("ConcreteProxyEndPoint") {}
}

しかし、BaseProxy と ConcreteProxy の間に追加の抽象クラスを追加することに決めました。基本クラスと同じコンストラクターのセットを提供する必要はありません。

class DualChannelBaseProxy : BaseWCFProxy { public DualChannelBaseProxy(string enpointName) : base(endpointName) {} }

経験則として、抽象子を作成する場合は、すべての基本クラスのコンストラクターを「継承」することを検討する必要があります。具体的な子を作成する場合は、クライアントに適した別個のコンストラクターのセットを提供できます。

PSデストラクタのオーバーロードのような概念がないため、デストラクタには同じ問題はありません。そして、それらはデフォルトで継承されます。つまり、子孫は追加のロジックを提供できますが、基本バージョンを呼び出す必要があります。

于 2012-11-26T11:17:31.063 に答える