java - 从 super 对象创建子对象

标签 java design-patterns inheritance

我有 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/

相关文章:

java - 将 JSON 名称映射到 Java 类字段/方法(Jackson Parser)

java - 合并两个以上外部库功能的设计模式

python - 责任链设计模式是否适合在硬件组件上运行的 Python 解决方案

c++ - 多态性:从基指针访问派生成员函数

java - 多重继承或多接口(interface)

java - 增量定时器

c# - IObservableCollection<ViewModel<T>> 包装 ObservableCollection<T>

java - 是否可以在子类中弃用父类(super class)的方法?

c++ - 尽管需要,但从未调用基类的重载函数

java - 拒绝直接访问jsp页面