2012-03-29 87 views
1

我发现自己希望一个接口可以由在几个类中实现的方法组成。如果我能做到这一点,我可以为一个角色创建一个接口,该角色具有该类中的一个函数和该类中的一个函数。两个类之间的接口拆分

任何语言对此支持吗?典型的Java/C#/ VB.NET风格的OO有可能吗?

例如:我有一个函数,它接受一个值对象,并将所有零件保存到正确的表中。我只是创建了一个名为StatsPersistence的接口,我将其注入到函数中,以便我可以对其行为进行单元测试,但它缺少一种方法。我想能够添加一个方法,但该方法与前两个不同的类,所以这显然是不可能的。所以,我在一个类中有两个方法,另一个在另一个类中,但它们都是“StatsPersistence”的“角色”所需的。而且,这些方法也是其他角色所需要的三种方法,而不仅仅是这一方面。

我有什么:

interface StatsPersistence 
    public saveSession(session) // fulfilled in much larger StatsActiveRecord 
    public saveAppUse(appUse) // fulfilled in much larger StatsActiveRecord 

我想要什么:

interface StatsPersistence 
    public saveSession(session) // fulfilled in much larger StatsActiveRecord 
    public saveAppUse(appUse) // fulfilled in much larger StatsActiveRecord 
    public updateUnit(name)  // fulfilled in much larger UnitActiveRecord 

可以只是使包装所有三种方法一个新的类,并有该类刚刚作出的呼吁两个实现者,但这看起来就像很多OOverkill一样。

我的想法是倾向于:

  • 我的界面作用过于宽泛
  • 作出这样的包装这三个类,并让它实现我想要的界面
+1

可能是门面模式? – 2012-03-30 00:45:11

+0

“接口是类必须满足的合同”而不是“类是接口必须应用的合同”。 – Dhananjay 2012-03-30 10:58:09

+0

@Dhananjay我知道,我只是希望可能有一个“未知的未知”潜藏在我对界面和类的理解之外,以及它们如何构成。也许一些新特性的使用,或者我不知道的函数式编程技术。 – Steve 2012-04-02 14:15:06

回答

2

假设你有一个变量类型StatsPersistence。接口契约强制StatsPersistence的任何实例拥有三种方法。因此,StatsActiveRecord不能存储为StatsPersistence,而UnitActiveRecord也不能。这意味着两个对象都不能成为StatsPersistence的实例,因为这两个对象都不满足接口合同。因此,在类之间拆分接口实现是不可能的。

有几种选择。

正如您所提到的,您可以拥有一个实现接口并调用两个独立类的主类。这可能会很棘手,因为这两个'小类'是由主人联系在一起的。

您提到的界面过于宽泛。如果合适,您可以拆分接口。

最好的解决方案(在一般情况下)是组合类。如果两个班级必须一起工作来决定谁做某些事情,那么他们可能是一个班级。