memberwiseclone是否也复制派生类中定义的成员?
本文关键字:定义 成员 是否 复制 派生 memberwiseclone | 更新日期: 2023-09-27 18:08:40
我需要定义一个Clone()方法来进行浅复制。(不需要深拷贝)
但是我也需要复制派生类的成员
如果我有
class Base {
int baseMember;
public (virtual?) Base Clone() {
return (Base)this.MemberwiseClone()
}
}
那么我应该为Clone()派生所有其他类吗?派生成员也会被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();
}
}
将派生(非静态)字段也被复制时调用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; }
}
另外,这个问题在这里已经有了答案。
我是否需要在派生类中重写(或重写)Clone
方法?
从技术上讲,这是不必要的,但是正如您所看到的,您必须强制转换结果,因为base.Clone()
方法的返回类型是Person
。
或者你可以这样重写你的基类Clone()
方法:
public T Clone<T>() where T:Person
{
return (T)this.MemberwiseClone();
}
那么你需要调用
Student b = a.Clone<Student>();
在派生类上。因此,您只需要在基类中编写一次clone方法。虽然我不确定这是否是最好的解决方案