Учитывая дерево иерархии, пусть это выглядит следующим образом:Как исправить реализацию ICloneable в иерархии дерева, внедренной абстрактным классом?
abstract class Person : ICloneable
...
sealed class Student : Person
...
Я хочу реализовать ICloneable интерфейс. В методе Student.Clone я хотел бы сделать что-то вроде:
{
Student clonedStudent = base.Clone() as Student;
clonedStudent.x1 = this.x1;
return clonedStudent
}
Потому что Person является абстрактным, я не могу создать Человек в Person.Clone() метод, поэтому я не могу вернуться клонированными людьми, поэтому я не могу клонировать человека.
Лучший ответ, который я выяснил, - это перегрузить метод Clone() в классе Person, чтобы получить Person, clone и вернуть его. Затем в реализации Student.Clone вызовите эту перегрузку, чтобы клонировать связанные с ней поля. Что-то вроде этого:
//In the Person class:
public abstract object Clone();
protected Person Clone(Person clonedPerson)
{
// Clone all person's fields
return clonedPerson:
}
//In the Student class:
public override object Clone()
{
Student clonedStudent = base.Clone(new Student()) as Student;
// Clone all student's fields
return clonedStudent
}
Конечно, если какой-либо из указанного класса, необходимого для создания какой-либо логики в своих конструкторах это решение является более чем бесполезным. Любая идея реализовать лучшую?
Я думаю, что это подзадача более общего, поэтому ответ будет очень хорошо вписываться в большой надмножество.
Что делает ваше решение выше «бесполезным»? Похоже, что это хороший подход на первый взгляд. – Enigmativity
@Enigmativity: Например, если класс Student в его конструкторе инициализирует некоторые поля только для чтения? Вызов конструктора по умолчанию заставляет эти поля оставаться неинициализированными и не может быть инициализирован в методе Clone(), поскольку они являются readonly. Это просто пример, который я себе представляю, в реальной постановке это будет катастрофическим. – mdarefull
Зачем вам нужны дубликаты изменяемого объекта? Тот факт, что это плохо поддерживается в языке и библиотеке, объясняется отсутствием спроса. –