gpt4 book ai didi

c# - memberwiseclone 还会复制派生类中定义的成员吗?

转载 作者:太空狗 更新时间:2023-10-30 00:51:57 25 4
gpt4 key购买 nike

我需要定义一个执行浅拷贝的 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();
}
}

最佳答案

在其基类上调用 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>();

在你的派生类上。所以你只需要在基类中写一次克隆方法。虽然我不确定这是否是最佳解决方案。

关于c# - memberwiseclone 还会复制派生类中定义的成员吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24236014/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com