以下是我的理解:
只有当角色/类型永远不会改变时才使用继承。
例如:
对于像这样使用继承:
消防员 <- 雇员 <- 人 是错误的。
一旦消防员弗雷迪(Freddy)更换工作或失业,您必须摧毁它并重新创建一个新类型的对象,并将所有旧关系附加到它上面。
因此,上述问题的简单解决方案是给Person类添加JobTitle枚举属性。
在某些情况下,这可能足够简单,例如如果您不需要与角色/类型相关联的非常复杂的行为。
更正确的方法是给Person类一个角色列表。
每个角色代表例如具有时间跨度的雇佣。
例如:
freddy.Roles.Add(new Employement( employmentDate, jobTitle ));
或者如果那太过于复杂:
freddy.CurrentEmployment = new Employement( employmentDate, jobTitle );
这样,弗雷迪可以成为开发者而不必我们先杀了他。
然而,我的胡言乱语还没有回答是否应该使用枚举或类型继承来处理职位标题。
在完全的内存对象导向编程中,我会说在这里使用继承更为正确。
但是,如果你正在进行O/R映射,则可能会在后台得到一个过于复杂的数据模型,如果映射器试图将每个子类型映射到新表中。
因此,在这种情况下,如果没有与类型相关的真正/复杂的行为,我通常会选择枚举方法。如果使用有限并使事情更轻松或不那么复杂,我可以接受“if type == JobTitles.Fireman …”。
例如,.NET的Entity Framework 4设计器只能将每个子类型映射到新表。在查询数据库时,您可能会得到一个丑陋的模型或许多连接,而没有任何实际的好处。
但是,如果类型/角色是静态的,我确实使用继承。
例如,对于产品。
您可能拥有CD <- Product 和 Book <- Product。
在这种情况下,继承获胜,因为您很可能会将不同状态与类型关联起来。
CD可能具有多个曲目属性,而书可能具有页数属性。
因此,总之,这取决于情况;-)
另外,在一天结束时,无论如何,您最终都可能会得到许多switch语句。
例如,如果您要编辑“产品”,即使使用继承,您也可能会有如下代码:
if (product is Book)
Response.Redicted("~/EditBook.aspx?id" + product.id);
因为在实体类中编码编辑图书的网址会很丑陋,它会强制您的业务实体了解您的站点结构等。