我有 Class1 类的 object1。我想将类 Class1 扩展到 Class2,添加一个方法,然后创建 Class2 的 object2,该对象在所有方法中的行为与 object1 完全相同,只是现在它有一个附加方法。
Class1 object1 = new Class1();
Class2 object2 = new Class2(object1);
object2.oldMethod();
object2.newMethod();
object1.oldMethod 应该与 object2.oldMethod 具有完全相同的行为。一个愚蠢的方法是编写一个脚本来生成新类,其中包含从 Class1 继承的所有 100 多个方法:
public class Class2 {
private final Class1 object1;
public Class2(Class1 object1) {
this.object1 = object1;
}
public void oldMethod() {
object1.oldMethod();
}
...
public void newMethod() {
...
}
}
但我想变得更聪明。怎么办?
编辑: 我很抱歉没有说得更明确。我从某个第三方获得了 object1,这个对象带有一些内部状态 - 比如说之前运行过一些 setter。我需要获得具有相同内部状态的 object2 (这就是我所说的执行方法时相同行为的意思)。我不能只扩展 Class1,然后从 Class2 获取 object2。 object2 如何知道 object1 的状态?我不知道 object1 的内部状态(变量、数组、字段)。
编辑2: 我想包装 object1,但不想为保持不变而编写 100 个包装器方法。
最佳答案
除非 Object1
具有复制构造函数,否则您不能使用继承,因为您是从 API 接收 Object1
的实例,而不是自己构造它。
您可能想要的是 Decorator Pattern 。在此模式中,装饰器由另一个对象组成,并通过装饰器向该对象添加功能。
class Object1 {
//...stuff...
}
class Decorator {
private Object1 object;
public Decorator(Object1 obj) {
object = obj;
}
public Object1 getComposite() {
return object;
}
public void extra() {
//Do stuff with object1 and any other state specific to the decorator
}
}
这也可以作为继承来完成,但只有当您真正尝试扩展 Object1
的接口(interface)而不是简单地增强接口(interface)时才有意义。
作为一个单独的说明,我认为实际尝试扩展第三方类并不明智,除非文档明确表明该类专为扩展而设计。 future 的版本可能会将该类标记为final
,或者构造该类可能会很复杂或具有包/私有(private)访问权限。此外,根据您的编辑,这甚至可能是不可能的。 Object1
需要一个复制构造函数,以便您可以扩展它并从 Object1
构造 Object2
的实例>.
关于java - 从 super 对象创建子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17156462/