OOP软件设计问题

时间:2010-01-28 15:13:32

标签: oop

有两个类:AB

我需要实现一个函数whoViewed

我有两个选项,使其成为AB的成员函数。这有点重复。

另一种选择是将它作为一个单独的类:Viewer,但它更抽象。

如果你是我,你会选择哪种方式?

使它更通用:

当您需要获取不同类别的统计信息时,您将采取什么措施(例如从数据库中获取最新查看的10个实体{AB} )在OOP的范围内。

7 个答案:

答案 0 :(得分:3)

我建议不要使用继承,而是使用组合。创建一个名为ViewMonitor的类,它将处理共享功能。可能性是没有合理的方法来设计继承结构。

答案 1 :(得分:2)

显然,在2个地方复制whoViewed()方法很糟糕,因此选项不在桌面上。您有第三个选项:创建一个实现whoViewed()的父类,并从中继承AB。着名的Gang of Four Design Patterns书推荐赞成合成而不是继承。所以这会建议你在问题中提到Viewer课程。鉴于您的问题中提供的上下文有限,我建议您参考GoF的建议并参加Viewer课程。

顺便提一下,如果您希望whoViewed()AB的实施方式不同,您可以使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()实现是分开的方式,请将它们写在各自的类中。

相关问题