最近我遇到了一些代码,它在基类中将子类型声明为枚举。以下是一个简单的示例:
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's possible.
*/
然而,当我阅读 维基百科关于继承的文章时,我没有找到任何答案来回答我的问题。
尽管一开始可能会引起争议,但我认为继承应该已经成熟到有一个确定的答案来解决这个困境。 这段代码是不好的,有坏味道的代码吗?还是可以接受和合理的?为什么?
Type
的公共 setter 几乎总是一个坏主意。我上面的评论假设有一个虚拟 getter 没有 setter,或者至少有一个受保护的 setter。 - CodesInChaos