复制抽象类的构造函数
我有一个名为AClass
的抽象类。 在同一个包中我有AnotherClass
,其中我有一个AClass
对象的ArrayList
。 在AnotherClass
的复制构造函数中,我需要在ArrayList
复制AClass
对象。
问题:
我不能在AClass
创建一个复制构造函数,因为它是一个抽象类,我不知道将由AClass
inheritance的类的名称。 实际上,在这个项目中,没有对象会从这个类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
创建一个复制构造函数,因为它是一个抽象类,我不知道将由AClass
inheritance的类的名称
这通常是正确的。 但是,由于您有一个AClass
列表, AClass
您不需要知道确切的子类型:创建副本的抽象函数就足够了:
protected abstract AClass makeCopy();
这类似于java.lang.Object
的clone()
函数,除了所有子类必须实现它,并且返回类型必须是AClass
。
由于每个子类都知道自己的类型,因此实现makeCopy()
方法应该没有问题。 以下是您的代码中的外观:
for (int i = 0 ; i < another.list.size() ; i++) { this.list.add(another.list.get(i).makeCopy()); }
注意:这种设计被称为原型模式 ,有时非正式地称为“虚拟构造函数”。