复制抽象类的构造函数

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

问题:

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

编辑 :这里是一些代码:

 public class AnotherClass{ private ArrayList list; ... /** Copy constructor */ public AnotherClass(AnotherClass another){ // copy all fields from "another" this.list = new ArrayList(); 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 } } ... } 

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

这通常是正确的。 但是,由于您有一个AClass列表, 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()); } 

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