两个类之间的接口拆分

时间:2012-03-29 17:49:37

标签: oop language-agnostic interface

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

有没有语言支持这个?是否有可能采用典型的Java / C#/ VB.NET样式OO?

例如:我有一个带有值对象的函数,并将所有部分保存到正确的表中。我刚刚创建了一个名为StatsPersistence的接口,我将其注入一个函数,因此我可以对其行为进行单元测试,但它缺少一个方法。我想能够添加一个方法,但该方法与前两个方法不同,所以这显然是不可能的。所以,我在一个类中有2个方法,在另一个类中有1个,但它们都是“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 个答案:

答案 0 :(得分:2)

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

有一些替代方案。

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

你提到界面太宽泛了。如果合适,您可以拆分界面。

最佳解决方案(在一般情况下)是组合类。如果两个班级必须共同决定谁做某些事情,他们也可能是一个班级。