Конструкторы не передаются производному классу при наследовании. И если в базовом классе не опредлен конструктор по умолчанию без параметров, а только конструкторы с параметрами (как в случае с базовым классом Person), то в производном классе мы обязательно должны вызвать один из этих конструкторов через ключевое слово base. Например, из класса Employee уберем определение конструктора:
class Employee: Person
{
public string Company { get; set; }
}
В данном случае мы получим ошибку, так как класс Employee не соответствует классу Person, а именно не вызывает конструктор базового класса. Даже если бы мы добавили какой-нибудь конструктор, который бы устанавливал все те же свойства, то мы все равно бы получили ошибку:
public Employee(string fName, string lName, string comp)
{
FirstName = fName;
LastName = lName;
Company = comp;
}
То есть в классе Employee через ключевое слово base надо явным образом вызвать конструктор класса Person:
public Employee(string fName, string lName, string comp)
: base(fName, lName)
{
Company = comp;
}
Либо в качестве альтернативы мы могли бы определить в базовом классе конструктор без параметров:
class Person
{
// остальной код класса
// конструктор по умолчанию
public Person()
{
FirstName = "Tom";
LastName = "Johns";
Console.WriteLine("Вызов конструктора без параметров");
}
}
Тогда в любом конструкторе производного класса, где нет обращения конструктору базового класса, все равно неявно вызывался бы этот конструктор по умолчанию. Например, следующий конструктор
public Employee(string comp)
{
Company = comp;
}
Фактически был бы эквивалентен следующему конструктору:
public Employee(string comp)
:base()
{
Company = comp;
}