Почему абстрактный класс имеет конструктор?

Почему абстрактный класс имеет конструктор? Какой смысл? Очевидно, что мы не можем создать экземпляр абстрактного класса.

Ответы

Ответ 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 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, конструктор неявно вызывается при построении a Dog.

ВЫХОД:
Конструктор животных, называемый
Конструктор собак под названием
Пользовательский разговор
По умолчанию Speak

Ответ 2

Вы все равно можете инициализировать любые переменные, зависимости, и вы можете настроить подпись конструкторов унаследованных классов.

Обычно вам нужны абстрактные классы, когда вам нужно иметь разные стратегии для некоторых конкретных случаев, поэтому имеет смысл делать все остальное в абстрактном классе. И это хорошая практика, чтобы сделать конструктор protected.