21

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

4

2 に答える 2

25

重要な理由の 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
        }
    }

Animalwith を直接構築することはできませんがnew、コンストラクターは、 を構築するときに暗黙的に呼び出されDogます。

出力: Custom Speak Default Speakと呼ばれる Dog コンストラクタと呼ば
れる Animal コンストラクタ


于 2013-11-13T03:37:59.970 に答える
7

変数や依存関係を初期化することも、継承されたクラスのコンストラクターの署名を設定することもできます。

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

于 2013-11-13T03:24:11.870 に答える