Kurucu versus Clone()
C# (derin) bir sınıf için kopya işlevsellik eklemek için tercih edilen yolu nedir? Bir kopya yapıcı veya ICloneable
yerine türetmek uygulamak ve Clone()
yöntemi uygulamak gerekir?
Açıklama: ""Parantez çünkü alakasız olduğunu düşündüm. içinde derin yazdım Görünüşe göre Diğerleri whether a copy constructor/operator/function needs to make clear which copy variant it implements sordum katılmıyorum.
CEVAP
ICloneable
türetmek gerekir.
Sebebi Microsoft tasarlanmış .net çerçeve hiç belirtilmiş olup Clone()
yöntem ICloneable
... olması gereken derin veya sığ klon, böylece arayüz anlamsal kırık olarak arayanlar olmayacak biliyorum olsun arayacak derin veya sığ klon nesne.
Bunun yerine, DeepClone()
(ShallowClone()
) yöntemleri ile IDeepCloneable
(IShallowCloneable
) kendi arayüzleri tanımlamak gerekir.
Tanımlayabilirsiniz iki arabirimi, bir genel parametre için destek kesinlikle yazılmış klonlama ve biri olmadan tutmak için zayıf yazılı klonlama yeteneği için zaman çalıştığınız koleksiyonları farklı cloneable nesneler:
public interface IDeepCloneable
{
object DeepClone();
}
public interface IDeepCloneable<T> : IDeepCloneable
{
T DeepClone();
}
Sonra böyle: uygulamak istiyorsunuz
public class SampleClass : IDeepCloneable<SampleClass>
{
public SampleClass DeepClone()
{
// Deep clone your object
return ...;
}
object IDeepCloneable.DeepClone()
{
return this.DeepClone();
}
}
Arabirimleri bir kopyasını farklı olarak tarif yapıcı kullanmayı tercih ediyorum genelde niyeti açık tutar. Bir kopya yapıcı muhtemelen derin bir klon olarak kabul olurdu, ama kesinlikle İDeepClonable bir arabirim kullanarak net bir niyet olarak çok değil.
Bu tartışılan bir konu .net 14 ** Brad Abrams' blog
Varsayılan boş parantez kurucu...
Nasıl sınıf alanları, Visual Studio ve...
'Java numaralama avantajı ne vers...
Ne kadar iş bir kurucu yapılmalıdır?...
Çatal arasındaki fark(), vfork(), exec...