Bundan türetmemelisin ICloneable.
Bunun nedeni, Microsoft .net çerçevesini tasarladığında, Clone()yöntemin ICloneablederin veya sığ bir klon olup olmayacağını asla belirtmemiş olmasıdır , bu nedenle arayanlar, aramanın nesneyi derin mi yoksa sığ klonlayacağını bilemeyecekleri için arayüz anlamsal olarak bozuktur.
Bunun yerine, kendi IDeepCloneable(ve IShallowCloneable) arayüzlerinizi DeepClone()(ve ShallowClone()) yöntemleriyle tanımlamalısınız .
İki arabirim tanımlayabilirsiniz; biri güçlü biçimde yazılmış klonlamayı desteklemek için genel bir parametreye sahipken, diğeri farklı türden klonlanabilir nesnelerin koleksiyonlarıyla çalışırken zayıf yazılan klonlama yeteneğini korumaksızın:
public interface IDeepCloneable
{
object DeepClone();
}
public interface IDeepCloneable<T> : IDeepCloneable
{
T DeepClone();
}
Bunu daha sonra şu şekilde uygularsınız:
public class SampleClass : IDeepCloneable<SampleClass>
{
public SampleClass DeepClone()
{
// Deep clone your object
return ...;
}
object IDeepCloneable.DeepClone()
{
return this.DeepClone();
}
}
Genel olarak, bir kopya oluşturucunun aksine açıklanan arayüzleri kullanmayı tercih ederim, bu da amacı çok net tutar. Bir kopya oluşturucunun muhtemelen derin bir klon olduğu varsayılır, ancak kesinlikle bir IDeepClonable arayüzü kullanmak kadar net bir amaç değildir.
Bu, .net Çerçeve Tasarım Kılavuzunda ve Brad Abrams'ın blogunda tartışılmaktadır.
(Sanırım bir uygulama yazıyorsanız (bir çerçeve / kitaplığın aksine) ekibinizin dışından hiç kimsenin kodunuzu çağırmayacağından emin olabilirsiniz, bu çok da önemli değil ve anlamsal bir anlam atayabilirsiniz. .net ICloneable arayüzüne "deepclone", ancak bunun iyi belgelendiğinden ve ekibiniz içinde iyi anlaşıldığından emin olmalısınız. Şahsen ben çerçeve kurallarına bağlı kalırım.)