我上课像:
MyClass extends MyAbstractClass implement myInterface1, myInterface2,...
我需要创建具有其他字段的新类:
MyType1 field1;
MyType2 field2;
.......
似乎正确创建了将包装MyClass的新类,如下所示:
MyWrapClass {
MyClass myClass=new MyClass(...);
MyType1 field1;
MyType2 field2;
.....
但是MyWrapClass用作类型myInterface1或myInterface2!
所以问题是:我应该在MyWrapClass中声明接口(interface)myInterface1,myInterface2所需的所有方法吗?还是存在另一种方式?
谢谢。
最佳答案
基本上有两种方法。第一个是扩展基类:
public class MySubClass extends MyClass {
private MyType1 field1;
private MyType2 field2;
....
第二种选择是使用合成:
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();
}
...
}
许多Java Gurus推荐第二个选项:
乔什·布洛赫(Josh Bloch)的书《有效的Java第二版》
继承文件,否则禁止
好的面向对象设计并不是要自由地扩展现有的类。你的第一个
本能应改为作文。
另请参阅http://en.wikipedia.org/wiki/Composition_over_inheritance
P.S .:一些现代IDE支持自动生成合成代码