Конструктор копирования для абстрактного класса

у меня есть абстрактный класс с именем AClass. В том же пакете у меня есть AnotherClass, в котором у меня есть ArrayList of AClass объекты. В конструкторе копирования AnotherClass мне нужно сделать дубликат AClass объекты внутри ArrayList.

проблема:

Я не могу создать конструктор копии в 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
        }
    }
...
}

1 ответов


Я не могу создать конструктор копии в AClass потому что это абстрактный класс, и я не могу знать имя класса, который унаследует AClass

это вообще правильно. Однако, так как у вас есть список AClass, вам не нужно знать точный подтип: достаточно абстрактной функции, которая делает копию:

protected abstract AClass makeCopy();

это похоже на