关于java:继承与委派

Inheritance vs. Delegation

本问题已经有最佳答案,请猛点这里访问。

下面的代码显示了继承如何重用方法m()。代表团如何工作?谢谢!

1
2
3
4
5
6
7
8
  class A{
  int m();
  }

 class B extends A{}

 B b =new B()
 b.m();


继承意味着是-a:"B类的一个实例是-a类的一个实例"。

组合是指has-a:"b类的一个实例has-a类的一个实例"。

这样地:

1
2
3
4
5
6
7
8
class B {

    private A a;

    public B(A a) { this.a = a; }

    public int m() { return a.m(); }
}

类B将其对m()的调用委托给它的类A实例。

如果两者都实现了一个公共接口,这会有所帮助。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public interface DoSomething {
    int m();
}

class A implements DoSomething {
    public int m() { return 1; }
}

class B implements DoSomething {

    private A a;

    public B(A a) { this.a = a; }

    public int m() { return a.m(); }
}

1
2
3
4
5
class B {
    int m() {
        return new A().m();
    }
}

1
2
3
4
5
6
class B {
    private A a = new A();
    int m() {
        return a.m();
    }
}

1
2
3
4
5
6
7
8
9
10
11
class B {
    private A a;

    public B(A a) {
        this.a = a;
    }

    int m() {
        return a.m();
    }
}