抽象类的复制构造函数

2022-09-04 02:49:51

我有一个名为 的抽象类。在我拥有的同一包中,我有一个对象。在复制构造函数中,我需要在 .AClassAnotherClassArrayListAClassAnotherClassAClassArrayList

问题:

我无法在 中创建复制构造函数,因为它是一个抽象类,并且我不知道将由 继承的类的名称。实际上,在此项目中,不会从此类继承任何对象,但是此项目将被其他项目用作库,这些项目将提供 类子级 。我的设计中是否有错误,或者是否有解决此问题的方法?AClassAClassAClass

编辑:这里有一些代码:

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

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

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

protected abstract AClass makeCopy();

这类似于 的函数,只是所有子类都必须实现它,并且返回类型必须为 。clone()java.lang.ObjectAClass

由于每个子类都知道自己的类型,因此它们在实现方法时应该没有问题。这是您在代码中的外观:makeCopy()

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

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


答案 2