【发布时间】:2013-06-17 20:41:36
【问题描述】:
我有 Class1 类的 object1。我想将 Class1 类扩展到 Class2 添加一个方法,然后创建 Class2 的 object2,它在所有方法中的行为都与 object1 完全相同,只是现在它会有一个附加方法。
Class1 object1 = new Class1();
Class2 object2 = new Class2(object1);
object2.oldMethod();
object2.newMethod();
object1.oldMethod 应该具有与 object2.oldMethod 完全相同的行为。一种愚蠢的方法是编写一个脚本,该脚本将生成具有所有 100 多个从 Class1 继承的方法的新类:
public class Class2 {
private final Class1 object1;
public Class2(Class1 object1) {
this.object1 = object1;
}
public void oldMethod() {
object1.oldMethod();
}
...
public void newMethod() {
...
}
}
但我想比这更聪明。怎么样?
编辑: 我很抱歉没有让它更明确。我从某个第 3 方获得了 object1,这个对象带有一些内部状态 - 比如说之前在它上面运行了一些 setter。我需要让 object2 具有相同的内部状态(这是我在执行方法时的相同行为的意思)。我不能只扩展 Class1,然后从 Class2 中获取 object2。 object2 如何知道 object1 的状态?我不知道object1的内部状态(变量、数组、字段)。
EDIT2: 我想包装 object1,但不想为了保持不变而编写 100 个包装方法。
【问题讨论】:
-
是什么阻止您在 Class1 中包含
newMethod? -
是的...对我来说听起来像是继承!
extends关键字救援 -
我没有修改 Class1 的权限,并且他们的 API 为我提供了 object1。
-
你不必修改class1,你只需要让它可见。
-
Class1是否实现了接口?如果是这样,您就有能力为拥有object1的那个接口创建一个动态代理,除非您特别更改,否则将该接口中的任何方法发送到object1。你可以让代理拦截一两个方法来做不同的事情,你可以让代理使用object1来执行新的方法。你不需要Class1的源代码,但你需要那个接口。但是如果你需要修改很多Class1的行为,或许你应该试试AspectJ。
标签: java design-patterns inheritance