2011-09-26 48 views
1

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

回答

4

是的,您可以使用委派。 Bar不包含Foo,而是包含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! } 
} 
+0

好了,超类必须实现相同的接口,子类? –

+0

这是正确的。 –

3

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

要么你的课程设计时考虑了继承(即它提供了非最终的公共和受保护的方法,打算被子类覆盖),或者设计时考虑到了作文或委派(通过使用策略模式,例如)。

如果该类尚未设计用于定制,您可能可以使用继承来定制它,但不能使用组合/委派机制。

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 */}) 
    } 
}