【发布时间】:2015-09-01 22:59:59
【问题描述】:
假设类库的一部分具有以下层次结构:
class Super {
void doSomething() {
System.out.println("Super is doing something");
}
}
class SubOne extends Super {
@Override
void doSomething() {
System.out.println("SubOne is doing something");
}
void doSomethingElse() {
System.out.println("SubOne is doing something else");
}
}
class SubTwo extends Super {
@Override
void doSomething() {
System.out.println("SubTwo is doing something");
}
void doSomethingDifferent() {
System.out.println("SubTwo is doing something different");
}
}
现在有人定义了一个与 SubOne 和 SubTwo 类相关的新接口提供行为:
interface NewBehavior {
void doSomethingNew();
}
据我所知,如果我们不能修改 Super、SubOne 和 SubTwo 的源代码,有两种方法可以定义实现 NewBehavior 的 SubOne 和 SubTwo 的新版本。
一种是在 Super 的子类中实现 NewBehavior,然后通过子类化新版本的 Super(并可能包装 SubOne 和 SubTwo 对象)来创建新版本的 SubOne 和 SubTwo:
class ExtendingSuperNewBehavior extends Super
implements NewBehavior {
@Override
public void doSomethingNew() {
System.out.println("ExtendingSuperNewBehavior is doing something new");
}
}
class ExtendingSuperSubOneNewBehavior extends ExtendingSuperNewBehavior {
// Here we need to either wrap SubOne or redefine doSomethingElse()
// with the same implementation.
// SubOne mSubOne = new SubOne();
// void doSomethingElse() {
// mSubOne.doSomethingElse();
// }
void doSomethingElse() {
System.out.println("SubOne is doing something else");
}
}
class ExtendingSuperSubTwoNewBehavior extends ExtendingSuperNewBehavior {
// Here we need to either wrap SubTwo or redefine doSomethingDifferent()
// with the same implementation.
// SubTwo mSubTwo = new SubTwo();
// void doSomethingDifferent() {
// mSubTwo.doSomethingDifferent();
// }
void doSomethingDifferent() {
System.out.println("SubTwo is doing something different");
}
}
另一种是定义一个实现NewBehavior的类,并在SubOne和SubTwo的每个新版本中包装一个实例:
class NewBehaviorImpl implements NewBehavior {
@Override
public void doSomethingNew() {
System.out.println("NewBehaviorImpl is doing something new");
}
}
class ImplementingSubOne extends SubOne
implements NewBehavior {
NewBehavior mNewBehavior = new NewBehaviorImpl();
public void doSomethingNew() {
mNewBehavior.doSomethingNew();
}
}
class ImplementingSubTwo extends SubTwo
implements NewBehavior {
NewBehavior mNewBehavior = new NewBehaviorImpl();
public void doSomethingNew() {
mNewBehavior.doSomethingNew();
}
}
显然,这两种方法都有效,但如果 SubOne 和/或 SubTwo 公开一个大接口(如库类通常所做的那样),则无论选择哪种方法,都需要进行大量方法转发。
谁能想出一种方法来重用相同的接口实现来避免代码转发?这会很有帮助。
【问题讨论】:
-
使用回调的观察者模式值得研究
标签: java interface code-reuse