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