|
|
1
25
这是我将采取的方法:
当然,MyDefaultImplementation可能需要是私有的,或者它自己的顶级类,这取决于什么是合理的。 然后,可以在实现中包含以下内容:
当然,只有在没有国家参与的情况下,上述方法才有效。 |
|
2
16
您可以将接口转换为抽象类,并根据需要为方法提供默认实现。 更新: 我明白了,多重继承结束了把接口变成抽象类的过程。。。在这种情况下,我也会和你一样。如果方法的默认实现不依赖于状态,那么它们的最佳位置确实是在静态实用程序类中。但是,如果涉及到状态,我会考虑对象组合,它甚至可能最终成为类似 Decorator |
|
|
3
8
现在Java 8已经推出,这种模式更好了:
Lambda得到了所有的关注,但这是java8给我们公司带来的最实际的好处。当我们不再需要抽象类来实现默认的方法时,继承层次结构就变得简单多了。 |
|
|
4
1
静态实现有两个问题:
|
|
|
5
1
我还将使用静态方法声明无状态功能的默认功能。 对于有状态功能,我更喜欢组合而不是继承。通过组合和使用委托/适配器,您可以组合来自许多源的默认功能。 例如
实现多个接口也是这种方法扩展得更好的一种情况。
抽象类不能这样做。我在一些项目中使用过这种组合方法,效果很好。 |
|
|
6
1
作为对N8g评论的回应,您可以对基或适配器进行子类化,但不是
必修的
子类——您可以自己从头开始实现接口。基类或适配器是为了方便而提供的,它实现了no-op方法,所以您不必这样做,或者在抽象基类(比如我的
|
|
|
7
1
大多数时候,我会这样说:
我倾向于使用内部类,因为这些类确实是相关的,但是您也可以使用常规类。
另外,您可能希望将实用程序类(
另一个好方法是适配器,正如PersicsB所指出的那样。 |
|
|
8
1
Dependency injection 可以提供委托,并指定一个默认实现——可以在单元测试中重写。 例如 Guice 框架为其默认实现支持接口上的注释,该注释可以由单元测试中的显式绑定覆盖。
|
|
|
9
0
在灵活性方面,组合胜过多重继承。与适配器模式(参见GOF书籍)一样,它显然允许我们根据调用方的请求调整(变形)类以适应不同的行为。看到了吗
|
|
|
10
0
您可以重新检查是否有充分的理由不将您认为默认的实现合并到实现该接口的第一个抽象类中—您知道,对现实的适应:-) 此外,您还可以在抽象类中创建辅助的、受保护的虚拟方法,接口派生方法将调用该抽象类,从而赋予您更多的控制权,即派生类不必替换这些方法并复制;粘贴90%的代码-它可以重写从主方法调用的方法。给你一定程度的行为遗传。 |