我有一个名为的抽象类AClass
。在同一个包中我有AnotherClass
,其中我有一个ArrayList
of AClass
对象。在复制构造函数中AnotherClass
我需要复制一份AClass
里面的物体ArrayList
.
问题:
我无法在中创建复制构造函数AClass
因为它是一个抽象类,我不知道将继承的类的名称AClass
。实际上,在这个项目中,没有对象会继承这个类,但是这个项目将被其他项目用作库,这些项目将提供以下子类AClass
。我的设计有错误吗?或者有解决这个问题的方法吗?
Edit:这是一些代码:
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
}
}
...
}
我无法在中创建复制构造函数AClass
因为它是一个抽象类,我不知道将继承的类的名称AClass
这通常是正确的。但是,由于您有一个列表AClass
,您不需要知道确切的子类型:制作副本的抽象函数就足够了:
protected abstract AClass makeCopy();
这类似于clone()
的功能java.lang.Object
,除了所有子类必须实现它,并且返回类型必须是AClass
.
由于每个子类都知道自己的类型,因此它们的实现应该没有问题makeCopy()
方法。这是您的代码中的样子:
for (int i = 0 ; i < another.list.size() ; i++) {
this.list.add(another.list.get(i).makeCopy());
}
注:该设计被称为原型模式 http://en.wikipedia.org/wiki/Prototype_pattern,有时非正式地称为“虚拟构造函数”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)