给定一个树层次结构,假设它如下:
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() 方法中创建 Person,所以无法返回克隆的 Person,因此无法克隆 Person。
我想出的最佳答案是重载 Person 类中的 Clone() 方法以接收 Person,克隆并返回它。然后在 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
}
当然,如果上述任何一个类都需要在其构造函数中构建任何逻辑,那么这个解决方案就毫无用处了。有什么想法可以实现更好的吗?
我认为这是一个更一般的问题的子问题,因此答案将非常适合大型超集。