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();
    }
}

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方法。虽然我不确定这是否是最好的解决方案