【发布时间】:2013-11-29 20:39:24
【问题描述】:
最近我遇到了一些将子类型声明为基类中的枚举的代码。这是一个简单的例子:
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
}
}
根据我的开发经验,我写了an article 关于它,声明这是一个糟糕的实践/设计。我认为这很糟糕,因为基类应该对其子类不可知。它应该没有关于其子类的信息,这至少有两个原因:
- 可扩展性:此设计不可扩展,因为如果您想定义另一个派生类,例如
Developer,您还应该更新您可能无权访问的EmployeeType枚举。 -
自相矛盾的定义:现在你可以写这段代码了:
Secretary secretary = new Secretary(); secretary.EmployeeType = EmployeeType.Manager; /* This is absurd semantically. But syntactically, it's possible. */
但是,当我阅读Wikipedia's article about inheritance 时,我找不到任何问题的答案。
虽然乍一看可能有争议,但我相信继承应该足够成熟,可以为这个困境提供可靠的答案。这段代码不好吗,smelly code?还是可以接受和合理的?为什么?
【问题讨论】:
-
我认为关键问题是它在这里是做什么用的?如果我看到 Java 中的等效代码,我会假设程序员不理解 OOP...
-
通常是糟糕的设计。但在某些情况下(通常如果子类型集有限),它可能是一种有用的模式,类似于 F# 提供的区分联合。
-
Type上的公共设置者几乎总是一个坏主意。我上面的评论假设一个没有 setter 的虚拟 getter,或者至少是一个受保护的 setter。 -
我做了一个更新可能值得一看。
标签: c# oop object-oriented-analysis