如果您有權訪問您的源代碼(我猜是這裏的情況),那麼絕對聲明它爲virtual
並覆蓋它。如果隱藏基地Clone
與new
可能是一個壞主意。如果任何代碼不知道它與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!