我需要定义一个执行浅拷贝的Clone()方法。 (不需要深层复制)
但我需要复制派生类的成员。
如果我有
class Base {
int baseMember;
public (virtual?) Base Clone() {
return (Base)this.MemberwiseClone()
}
}
然后我应该为Clone()派生所有其他类吗? derivedMember也会被Base.Clone()?
复制class Derived {
int derivedMember; //will this also be copied by base.Clone()?
//Necessary?
public new Derived (override Base?) Clone() {
return (Derived)this.MemberwiseClone();
}
}
答案 0 :(得分:6)
在基类上调用this.MemberwiseClone()
时是否也会复制派生(非静态)字段?
是的,他们可以通过写一个像这样的小测试来保证自己:
private static void Main(string[] args)
{
Student a = new Student() { Name = "John Doe", Id = 1 };
Student b = (Student)a.Clone();
}
public class Person
{
public string Name { get; set; }
public virtual Person Clone()
{
return (Person)this.MemberwiseClone();
}
}
public class Student:Person
{
public int Id { get; set; }
}
此问题已经answered here。
我是否需要覆盖(或重写)派生类中的Clone
方法?
从技术上讲,它没有必要,但正如您所见,您必须转换结果,因为base.Clone()
方法的返回类型为Person
。
或者你可以像这样重写你的基类Clone()
方法:
public T Clone<T>() where T:Person
{
return (T)this.MemberwiseClone();
}
然后你需要打电话
Student b = a.Clone<Student>();
在派生类上。所以你只需要在基类中编写一次clone方法。虽然我不确定这是否是最佳解决方案。