抽象类的复制构造函数

15

我有一个名为AClass的抽象类。在同一包中,我有AnotherClass,其中我有一个AClass对象的ArrayList。在AnotherClass的复制构造函数中,我需要复制ArrayList中的AClass对象。

问题:

我不能在AClass中创建复制构造函数,因为它是一个抽象类,我无法知道将继承AClass的类的名称。实际上,在此项目中,没有对象将继承自此类,但此项目将作为库被其他将提供AClass子类的项目使用。我的设计中是否存在错误?还是有解决这个问题的方法?

编辑: 这里是一些代码:

public class AnotherClass{
    private ArrayList<AClass> list;
...
    /** Copy constructor
    */
    public AnotherClass(AnotherClass another){
        // copy all fields from "another"
        this.list = new ArrayList<AClass>();
        for(int i = 0; i < another.list.size(); i++){
            // Option 1: this.list.add(new AClass(another.list.get(i)));
            // problem: cannot instantiate AClass as it is abstract
            // Option 2: this.list.add(another.list.get(i).someKindOfClone());
            // problem? I'm thinking about it, seems to be what dasblinkenlight is suggesting below
        }
    }
...
}

2
你能分享相关代码吗?那样更容易理解情况。 - Jeroen Vannevel
1
AClass 是抽象的。你不能创建 AClass 的实例。 - Jimmy
1
@Jimmy:有人会实例化 AClass 的一个子类,我需要为这些未知对象提供一个复制构造函数。等一下我会给你展示一些代码。 - HAL9000
1
Jon Skeet在这里。他不会错过的。您可以直接接受下面的答案,然后稍后再阅读它 ;) - Jimmy
我正在考虑这个问题,似乎就是dasblinkenlight在下面所建议的。没错,那正是我下面所建议的 :-) - Sergey Kalinichenko
你可以在给定的循环内使用空匿名类来实现抽象类。 - rogue lad
1个回答

16
这通常是正确的。然而,由于您有一个AClass列表,您不需要知道确切的子类型:编写一个创建复制品的抽象函数即可。
protected abstract AClass makeCopy();

这类似于java.lang.Objectclone()函数,但所有子类都必须实现它,并且返回类型需要是AClass

由于每个子类都知道自己的类型,它们应该没有问题实现makeCopy()方法。以下是在您的代码中如何实现:

for (int i = 0 ; i < another.list.size() ; i++) {
    this.list.add(another.list.get(i).makeCopy());
}

注意:这个设计称为原型模式,有时非正式地称为“虚拟构造函数”。


如果我要做这样的事情,我也会这样做,是的 :) +1 - Sage

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接