实现接口的组合与类

时间:2018-08-06 13:59:26

标签: java interface composition solid-principles

让我们考虑两个实体AEntity和BEntity,以及两个接口I1和I2。假设

interface I1 {
    void do1();
}

interface I2 {
    void do2();
}

class AEntity implements I1, I2 {

}

class BEntity implements I1 {

}

void doSomething(I1 obj) {
    obj.do1();
}

这是一个假设的案例,我确实没有这样的问题。我只是想清楚地理解一些设计原则。在上述情况下,我可以将AEntity,BEntity的任何实例或它们的任何子类实例传递给doSomething方法。只要参数是I1的实例,该方法就可以正常工作(假定所有类确实需要I1.do1(),LSP)。 如果我决定使用合成来重构实体,则我的类将如下所示。

class AEntity {
    I1 i1;
    I2 i2;
    ...
}

class BEntity {
    I1 i1;
    ...
}

现在,要使这些实体能够传递给doSomething方法,应该怎么做?

  1. 让实体实现接口,并将调用重定向到类(或)中现在可用的具体实现
  2. 遍历对象i1和i2中可用的实现,而不要传递实体对象。

我个人认为第一种方法更自然。但是,当实体由许多单独的组件组成时,不得不列出所有实现的接口似乎有些奇怪。可能就是应该怎么做,我只是不确定。还是应该将doSomething方法改为doSomethingOnAEntity并使其接受AEntity的所有子类型而不是I1?所有这些方法似乎都有效。我是否有理由选择一种方法而不是另一种方法?可能是其他一些设计原则,尤其是偏爱一种方法。

0 个答案:

没有答案