复制抽象类的构造函数

时间:2013-12-30 17:46:21

标签: java constructor abstract-class

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

问题:

我无法在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
        }
    }
...
}

1 个答案:

答案 0 :(得分:11)

  

我无法在AClass中创建复制构造函数,因为它是一个抽象类,我不知道将由AClass继承的类的名称

这通常是正确的。但是,由于您有一个AClass列表,因此您无需知道确切的子类型:创建副本的抽象函数就足够了:

protected abstract AClass makeCopy();

这类似于clone()的{​​{1}}函数,除了所有子类都必须实现它,并且返回类型必须是java.lang.Object

由于每个子类都知道自己的类型,因此实现AClass方法应该没有问题。以下是您的代码中的内容:

makeCopy()

注意:此设计称为prototype pattern,有时非正式地称为“虚拟构造函数”。