1

我有几个“A”类的子类,比如 B、C 和 D。我将其中几个存储在一个泛型中

ArrayList<A> stuff;

B、C 和 D 与 A 完全没有不同的数据成员。它们不同的唯一方式是通过不同的覆盖方法。我希望能够将 A 类的任何实例复制到 A 类的另一个实例(同时保留真正的子类)

就像是:

A obj1 = (A)new B(...)
A obj2 = (A)new C(...)
A obj3 = obj1.copy();
// (obj3 instanceof B) == true

通常这需要 B、C 和 D 来实现自定义复制方法。但是,这似乎是一种浪费,因为数据成员完全相同,并且它们只会存在以便保留类。

有什么办法可以让我只在 A 类中实现复制,并且仍然保留对象的底层类?

编辑:

如果我的想法是正确的,如果只有超类有一个复制方法,我会遇到的问题:

class A {
    int dataMember;
    public A copy() {
        A ret = new A(); // !!
        ret.dataMember = dataMember;
        return ret;
    }

}

当调用“new”时,我一般无法确定该类是 A 的哪个子类,并进一步显式实例化该类的实例。或者有没有办法做到这一点?

4

2 回答 2

1

你可以给A一个复制构造函数

class A {

    public A(A other) {
        //copy other's fields to this instance
    }
}

的子类A还可以公开一个构造函数,该构造函数接受一个A实例并将其传递给super构造函数:

class B extends A {

    public B(A other) {
        super(other);
    }
}
于 2012-04-28T02:25:42.313 回答
1

你熟悉克隆吗?它将复制您的所有字段并维护派生类。请注意,它不会克隆每个字段的对象,但它们将指向相同的引用。

public Object clone() {
    try {
        return super.clone(); 
    } catch (CloneNotSupportedException e) {} // Will never happen if your object implements the Cloneable interface
}
于 2012-04-28T03:40:01.423 回答