Недавно я наткнулся на некоторый код, который объявил типы children как перечисление в базовом классе. Вот простой пример:
public enum EmployeeType
{
Manager,
Secretary
}
public class Employee
{
public string Code { get; set; }
public EmployeeType Type { get; set; }
}
public class Manager : Employee
{
public void Manage()
{
// Managing
}
}
public class Secretary : Employee
{
public void SetMeeting()
{
// Setting meeting
}
}
Основываясь на моем опыте разработки, я написал статью об этом, заявив, что это плохая практика/дизайн. Я думаю, что это плохо, потому что базовый класс должен быть агностиком относительно своих классов детей. Он не должен иметь никаких сведений о своих классах детей, и здесь есть как минимум две причины:
- Расширяемость: эта конструкция не будет расширяемой, потому что если вы хотите определить другой производный класс, скажем,
Developer
, например, вы также должны обновить перечислениеEmployeeType
, к которому у вас может не быть доступа. -
Парадоксальное определение: теперь вы можете написать этот код:
Secretary secretary = new Secretary(); secretary.EmployeeType = EmployeeType.Manager; /* This is absurd semantically. But syntactically, it possible. */
Однако, когда я прочитал статью Википедии о наследовании, я не смог найти ответа на мой вопрос.
Хотя на первый взгляд это может показаться спорным, я считаю, что наследование должно быть достаточно зрелым, чтобы иметь надежный ответ на эту дилемму. Этот код плохой, вонючий код? Или это приемлемо и оправдано? Почему?