web-dev-qa-db-ja.com

抽象クラスにコンストラクターがあるのはなぜですか?

抽象クラスにコンストラクターがあるのはなぜですか?ポイントは何ですか?抽象クラスのインスタンスを作成できないことは明らかです。

18
Aslam Jiffry

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を構築すると、コンストラクターが暗黙的に呼び出されます。

出力:
動物のコンストラクターが呼び出されました
と呼ばれる犬のコンストラクター
カスタムスピーク
デフォルトの発言

22
P.Brian.Mackey

変数、依存関係を初期化でき、継承されたクラスのコンストラクターのシグネチャを設定できます。

特定のケースで異なる戦略を使用する必要がある場合、通常は抽象クラスが必要です。そのため、抽象クラスで他のすべてを実行できるのは理にかなっています。そして、コンストラクターをprotectedにすることをお勧めします。

7
AD.Net