我需要定义一个执行浅拷贝的Clone()方法.(不需要深层复制)
但我需要复制派生类的成员.
如果我有
class Base {
int baseMember;
public (virtual?) Base Clone() {
return (Base)this.MemberwiseClone()
}
}
Run Code Online (Sandbox Code Playgroud)
那么我应该为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();
}
}
Run Code Online (Sandbox Code Playgroud)
小智 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; }
}
Run Code Online (Sandbox Code Playgroud)
我是否需要覆盖(或重写)Clone派生类中的方法?
从技术上讲,它没有必要,但正如您所看到的那样,您必须转换结果,因为方法的返回类型base.Clone()是Person.
或者你可以Clone()像这样重写你的基类方法:
public T Clone<T>() where T:Person
{
return (T)this.MemberwiseClone();
}
Run Code Online (Sandbox Code Playgroud)
然后你需要打电话
Student b = a.Clone<Student>();
Run Code Online (Sandbox Code Playgroud)
在派生类上.所以你只需要在基类中编写一次clone方法.虽然我不确定这是否是最好的解决方案.