我上课像:

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第二版》
  • 项目16:在继承方面偏爱组成
  • 项目17:设计和
    继承文件,否则禁止

  • 好的面向对象设计并不是要自由地扩展现有的类。你的第一个
    本能应改为作文。

    另请参阅http://en.wikipedia.org/wiki/Composition_over_inheritance



    P.S .:一些现代IDE支持自动生成合成代码

    10-08 13:20