基本クラスで定義されていないコンストラクターを使用して継承クラスを作成する必要がありますか?問題は、継承クラスのコンストラクターにコンストラクターが必要なことです。基本クラスのコンポーネントを変更せずに、この問題をどのように解決できますか?:base()
3 に答える
いいえ。常に1の派生クラスのインスタンスを作成するということは、明示的または暗黙的に (派生クラスの他のコンストラクターを介して間接的に) 基本クラスのコンストラクターにチェーンすることを意味します。
ただし、パラメーターなしのコンストラクターである必要はありません。たとえば、次のようにすることができます。
public class Base
{
private readonly int id;
public Base(int id)
{
this.id = id;
}
}
public class Derived : Base
{
public Derived(int id) : base(id)
{
}
}
ただし、基本クラスのコンストラクターへの引数に使用する値は、パラメーターに直接関連付ける必要はありません。たとえば、上記と同じ基本クラスを使用すると、次のようになります。
public class Derived : Base
{
private readonly string name;
public Derived(string name) : base(name.Length)
{
this.name = name;
}
public Derived() : base(-1)
{
this.name = null;
}
}
重要なことは、各クラスが有効な方法で構築されていることを確認することです。たとえば、Base
がid
偶数であるか、またはそのようなものであることを検証する場合があります。派生クラスのインスタンスを作成するときにその検証をバイパスできるとしたら、コードの残りの部分がそれBase
に依存できなくなるため、ひどいことになります。 .
1さて、シリアライゼーションやその他の魔法のためにコンストラクターがまったく呼び出されないという奇妙なケースかもしれません。それらを無視しますが...
基本クラスとは異なる引数を持つコンストラクターを持つ継承クラスがあることには何の問題もありません。
public class Parent
{
public int Value { get; set; }
public Parent()
{
Value = 5;
}
}
public class Child : Parent
{
public string Text { get; set; }
public Child(string text)
: base() //note this line can be omitted; the compiler will add it automatically
{
Text = text;
}
}
constructorなしでクラスを実装することはできません。何も定義しなくても、デフォルトのコンストラクターは として機能しpublic BaseClass() { }
ます。基底クラスで定義されたコンストラクターにアクセスできないためです。問題は、基本クラスの実装を変更したくないか、まったく変更できないかです。
基本クラス コンストラクター (おそらく private または internal) のアクセス修飾子をprotectedまたはpublicに変更する必要があります。