有两个类:A
和B
。
我需要实现一个函数whoViewed
,
我有两个选项,使其成为A
和B
的成员函数。这有点重复。
另一种选择是将它作为一个单独的类:Viewer
,但它更抽象。
如果你是我,你会选择哪种方式?
使它更通用:
当您需要获取不同类别的统计信息时,您将采取什么措施(例如从数据库中获取最新查看的10个实体{A
或B
} )在OOP的范围内。
答案 0 :(得分:3)
我建议不要使用继承,而是使用组合。创建一个名为ViewMonitor
的类,它将处理共享功能。可能性是没有合理的方法来设计继承结构。
答案 1 :(得分:2)
显然,在2个地方复制whoViewed()
方法很糟糕,因此选项不在桌面上。您有第三个选项:创建一个实现whoViewed()
的父类,并从中继承A
和B
。着名的Gang of Four Design Patterns书推荐赞成合成而不是继承。所以这会建议你在问题中提到Viewer
课程。鉴于您的问题中提供的上下文有限,我建议您参考GoF的建议并参加Viewer
课程。
顺便提一下,如果您希望whoViewed()
和A
中B
的实施方式不同,您可以使Viewer
成为一个接口,并在{{1}中实现该接口}和A
。
答案 2 :(得分:1)
如果A和B中的WhoViewed具有完全相同的功能,则创建一个可以继承的类。
如果两个类的方法实现不同,如果它们已经从另一个类继承,则使用A和B的接口。
答案 3 :(得分:1)
我不建议在这里引入继承,因为它是严肃的决定,要求两个类在所有方面都是真正的多态。 在这种情况下 - 在第三个类中进行实现,使该类成为A和B的成员,然后将whoViewed方法的调用委托给该成员。 在伪代码中: C级 { WhoViewed(); }
A类{ C m_C; WhoVied { m_c.WhoViwed(); }
在B中与A中的相同。
如果用OOD语言说话 - 用委托替换继承。
答案 4 :(得分:1)
我会使用合成和委托给外部对象。你的问题听起来像是一个跨领域的问题,因此AOP可能是你的选择。
根据语言,您可以使用Mixins(Ruby)或Traits(Scala)。
答案 5 :(得分:1)
这似乎更像是一个AOP问题,应该使用一个方面来解决。
如果您可以将“who Viewed”视为一个方面,那么您可以从数据库中存储最新查看的10个实体。
然后,您将拦截对您的实体的调用,并将所需的元数据存储在易于定位的位置。
答案 6 :(得分:0)
如果 whoViewed()实现对于两者都相同,那么我希望有一个单独的辅助类或一个由A和B继承的抽象类。 如果 whoviewed()实现是分开的方式,请将它们写在各自的类中。