如何在java中包装类并保存接口?

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"

  • 第16项:赞成组合而不是继承
  • 第17项:继承的设计和文件,或禁止它

良好的面向对象设计不是关于自由扩展现有类.你的第一直觉应该是构图.

另见http://en.wikipedia.org/wiki/Composition_over_inheritance

继承的组合可以简化Business Domain类的初始设计,并在长期内提供更稳定的业务域.与继承类的层次结构相比,它对继承的优势在于更彻底地隔离利益.此外,继承模型通常在业务域类的定义期间设计,以便理解问题域中的信息,并且不一定反映各种系统对象的真实关系.

PS:一些现代IDE支持自动生成组合代码