在覆盖时使用组合而不是继承

时间:2011-09-26 10:26:17

标签: java design-patterns

如果我有一个我想通过覆盖一个类来自定义的类,如果它的方法我唯一能做的就是使用继承(子类和重写方法)?是否有可能以某种方式使用成分来实现同样的目标?

3 个答案:

答案 0 :(得分:4)

是的,你可以使用委托。 Foo不是从下面示例中的Bar派生,而是包含Foo并在其选择的位置委托给它。

interface SomeMethods {
  void doSomething();
  void doSomethingElse();
}

class Foo implements SomeMethod {
  public void doSomething() { // implementation }
  public void doSomethingElse() { // implementation }
}

class Bar implements SomeMethod {
   private final Foo foo = new Foo();

   public void doSomething() { foo.doSomething(); }
   public void doSomethingElse() { // do something else! }
}

答案 1 :(得分:3)

使用合成而不是继承是一种设计选择。

您的类的设计都考虑了继承(即它提供了非最终的公共和受保护的方法,旨在被子类覆盖),或者它的设计考虑了组合或委托(通过使用策略模式) , 例如)。

如果该类尚未设计用于自定义,您可以使用继承对其进行自定义,但不能使用组合/委派机制。

答案 2 :(得分:3)

不确定。您可以使用以下模式。

简单覆盖方法方法

模板方法模式

class Base {
    public void foo() {
        // do something
        bar();
        // do something
    }
    protected abstract void bar();
}

class Child {
    protected void bar() {
        // do something.
    }
}

<强>团

class Base {
    private Runnable r;
    protected Base(Runnable r) {
        this.r = r;
    }

    public void foo() {
        r.run();
    }
}

class Child extends Base {
    Child() {
        super(new Runnable() { /* implementation */})
    }
}