【发布时间】:2011-09-26 18:46:21
【问题描述】:
如果我有一个类,我想通过重写一个类来自定义它的方法,我唯一能做到的就是使用继承(子类化和重写方法)?是否可以以某种方式使用组合来实现相同的目标?
【问题讨论】:
标签: java design-patterns
如果我有一个类,我想通过重写一个类来自定义它的方法,我唯一能做到的就是使用继承(子类化和重写方法)?是否可以以某种方式使用组合来实现相同的目标?
【问题讨论】:
标签: java design-patterns
是的,您可以使用委托。在下面的示例中,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! }
}
【讨论】:
使用组合而不是继承是一种设计选择。
您的类要么在设计时考虑到继承(即它提供了非最终的公共和受保护方法,旨在被子类覆盖),要么在设计时考虑到组合或委托(通过使用策略模式, 例如)。
如果该类根本不是为定制而设计的,您也许可以使用继承来定制它,但不能使用组合/委托机制。
【讨论】:
当然。您可以使用以下模式。
方法method的简单覆盖
模板方法模式
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 */})
}
}
【讨论】: