抽象クラスにコンストラクターがあるのはなぜですか?ポイントは何ですか?抽象クラスのインスタンスを作成できないことは明らかです。
1つの重要な理由は、派生コンストラクターの実行前にベースコンストラクターへの暗黙的な呼び出しがあるという事実によるものです。インターフェイスとは異なり、抽象クラスには実装が含まれていることに注意してください。その実装では、フィールドの初期化または他のインスタンスメンバーが必要になる場合があります。次の例と出力に注意してください。
abstract class Animal
{
public string DefaultMessage { get; set; }
public Animal()
{
Console.WriteLine("Animal constructor called");
DefaultMessage = "Default Speak";
}
public virtual void Speak()
{
Console.WriteLine(DefaultMessage);
}
}
class Dog : Animal
{
public Dog(): base()//base() redundant. There's an implicit call to base here.
{
Console.WriteLine("Dog constructor called");
}
public override void Speak()
{
Console.WriteLine("Custom Speak");//append new behavior
base.Speak();//Re-use base behavior too
}
}
Animal
を使用してnew
を直接構築することはできませんが、Dog
を構築すると、コンストラクターが暗黙的に呼び出されます。
出力:
動物のコンストラクターが呼び出されました
と呼ばれる犬のコンストラクター
カスタムスピーク
デフォルトの発言
変数、依存関係を初期化でき、継承されたクラスのコンストラクターのシグネチャを設定できます。
特定のケースで異なる戦略を使用する必要がある場合、通常は抽象クラスが必要です。そのため、抽象クラスで他のすべてを実行できるのは理にかなっています。そして、コンストラクターをprotected
にすることをお勧めします。