如果您可以访问您的源(我猜这里就是这种情况),那么绝对将其声明为virtual 并覆盖它。如果用new 隐藏基础Clone 可能是个坏主意。如果任何代码不知道它正在使用B,那么它将触发错误克隆方法并且不会返回正确的克隆。
关于属性的赋值,或许可以考虑实现拷贝构造函数,每一层都可以处理自己的克隆:
public class A : ICloneable
{
public int PropertyA { get; private set; }
public A()
{
}
protected A(A copy)
{
this.PropertyA = copy.PropertyA;
}
public virtual object Clone()
{
return new A(this);
}
}
public class B : A, ICloneable
{
public int PropertyB { get; private set; }
public B()
{
}
protected B(B copy)
: base(copy)
{
this.PropertyB = this.PropertyB;
}
public override object Clone()
{
return new B(this);
}
}
每个复制构造函数调用将自身传递到链中的基本复制构造函数。每个继承级别都直接复制属于它的属性。
编辑:如果您使用 new 关键字来隐藏基本实现,这里有一个可能发生的示例。使用示例实现(表面上看起来不错)
public class A : ICloneable
{
public int PropertyA { get; protected set; }
public object Clone()
{
Console.WriteLine("Clone A called");
A copy = new A();
copy.PropertyA = this.PropertyA;
return copy;
}
}
public class B : A, ICloneable
{
public int PropertyB { get; protected set; }
public new object Clone()
{
Console.WriteLine("Clone B called");
B copy = new B();
copy.PropertyA = this.PropertyA;
copy.PropertyB = this.PropertyB;
return copy;
}
}
但是当你使用它时:
B b = new B();
A a = b;
B bCopy = (B)a.Clone();
//"Clone A called" Throws InvalidCastException! We have an A!