Ответ 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