Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 抽象类的复制构造函数_Java_Constructor_Abstract Class - Fatal编程技术网

Java 抽象类的复制构造函数

Java 抽象类的复制构造函数,java,constructor,abstract-class,Java,Constructor,Abstract Class,我有一个名为AClass的抽象类。在同一个包中,我有另一个类,其中有一个AClass对象的ArrayList。在另一个类的复制构造函数中我需要在ArrayList中复制AClass对象 问题是: 我无法在AClass中创建复制构造函数,因为它是一个抽象类,我无法知道将由AClass继承的类的名称。实际上,在这个项目中,没有对象将继承自这个类,但是这个项目将被其他项目用作库,这些项目将提供AClass的类子类。我的设计有错误吗?或者这个问题有解决方案吗 编辑:以下是一些代码: public cla

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

问题是:

我无法在
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
        }
    }
...
}
公共类另一类{
私有数组列表;
...
/**复制构造函数
*/
公共另一类(另一类){
//从“另一个”复制所有字段
this.list=new ArrayList();
for(int i=0;i//问题?我在想,这似乎是dasblinkenlight下面的建议
}
}
...
}
我无法在
AClass
中创建复制构造函数,因为它是一个抽象类,我无法知道将由
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());
}
for(int i=0;i

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

您能分享相关代码吗?这样解释情况更容易。
AClass
是抽象的。你不能拥有
AClass的实例
@Jimmy:其他人将实例化AClass的子对象,我需要为这些未知对象提供一个副本构造函数。过一会儿我会给你看一些代码Jon Skeet来了。他不会错过的。您可以直接接受下面的答案,然后稍后再阅读;)“我在想,这似乎是dasblinkenlight在下面所建议的”正确,这正是我在下面所建议的:-)如果我要做这样的事情,我也会这样做,是的:)+1