use*_*818 12 java inheritance class wrapper
我有这样的课:
MyClass extends MyAbstractClass implement myInterface1, myInterface2,...
Run Code Online (Sandbox Code Playgroud)
我需要创建包含其他字段的新类:
MyType1 field1;
MyType2 field2;
.......
Run Code Online (Sandbox Code Playgroud)
似乎正确创建将包装MyClass的新类:
MyWrapClass {
MyClass myClass=new MyClass(...);
MyType1 field1;
MyType2 field2;
.....
Run Code Online (Sandbox Code Playgroud)
但MyWrapClass用作myInterface1或myInterface2类型!
所以问题是:我应该在MyWrapClass中声明接口myInterface1,myInterface2所需的所有方法吗?还是存在另一种方式?谢谢.
Eug*_*sky 16
基本上,有两种方法.第一个是扩展基类:
public class MySubClass extends MyClass {
private MyType1 field1;
private MyType2 field2;
....
Run Code Online (Sandbox Code Playgroud)
第二种选择是使用组合:
public class MySubClass implements myInterface1, myInterface2 {
private MyClass delegate;
private MyType1 field1;
private MyType2 field2;
// for all methods in myInterface1, myInterface2
public SomeType method1() {
return delegate.method1();
}
...
}
Run Code Online (Sandbox Code Playgroud)
许多Java Gurus建议使用第二个选项:
Josh Bloch的书"Effective Java 2nd Edition"
良好的面向对象设计不是关于自由扩展现有类.你的第一直觉应该是构图.
另见http://en.wikipedia.org/wiki/Composition_over_inheritance
继承的组合可以简化Business Domain类的初始设计,并在长期内提供更稳定的业务域.与继承类的层次结构相比,它对继承的优势在于更彻底地隔离利益.此外,继承模型通常在业务域类的定义期间设计,以便理解问题域中的信息,并且不一定反映各种系统对象的真实关系.
PS:一些现代IDE支持自动生成组合代码