这是我的推理方式:
仅当角色/类型永远不会改变时才使用继承。例如
将继承用于以下方面:
消防员 <- 员工 <- 人是错误的。
一旦消防员弗雷迪换工作或失业,您必须杀死他并重新创建一个新类型的新对象,并附有所有旧关系。
因此,对上述问题的天真解决方案是将 JobTitle 枚举属性赋予 person 类。这在某些情况下就足够了,例如,如果您不需要与角色/类型相关的非常复杂的行为。
更正确的方法是给 person 类一个角色列表。每个角色代表例如具有时间跨度的工作。
例如
freddy.Roles.Add(new Employement( employmentDate, jobTitle ));
或者如果这是矫枉过正:
freddy.CurrentEmployment = new Employement( employmentDate, jobTitle );
这样,弗雷迪就可以成为一名开发人员,而我们不必先杀了他。
但是,如果您应该使用枚举或类型层次结构作为职称,我的所有杂谈仍然没有得到解答。
在纯内存 OO 中,我会说在这里使用继承作为职称更正确。
但是,如果您正在执行 O/R 映射,如果映射器尝试将每个子类型映射到新表,那么您最终可能会在幕后使用过于复杂的数据模型。因此,在这种情况下,如果没有与类型相关的真实/复杂行为,我通常会采用枚举方法。如果使用有限并且它使事情变得更容易或更不复杂,我可以接受“if type == JobTitles.Fireman ...”。
例如,.NET 的 Entity Framework 4 设计器只能将每个子类型映射到一个新表。当您查询数据库而没有任何实际好处时,您可能会得到一个丑陋的模型或大量连接。
但是,如果类型/角色是静态的,我会使用继承。例如产品。
您可能有 CD <- 产品和书籍 <- 产品。继承在这里获胜,因为在这种情况下,您很可能具有与类型关联的不同状态。CD 可能具有许多曲目属性,而一本书可能具有页数属性。
所以简而言之,这取决于;-)
此外,在一天结束时,您很可能最终会得到很多 switch 语句。假设你想编辑一个 "Product" ,即使你使用继承,你可能会有这样的代码:
if (product is Book) Response.Redicted("~/EditBook.aspx?id" + product.id);
因为在实体类中对编辑书 url 进行编码会很丑陋,因为它会迫使您的业务实体了解您的网站结构等。