SORU
27 Temmuz 2010, Salı


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
27 Temmuz 2010, Salı


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

(Sanırım eğer yazılı bir uygulama (karşıt olarak bir çerçeve/kütüphane) böylece emin olun kimse dışında takım olacak çağrı kodu, fark etmez çok atayabilirsiniz bir semantik anlam "deepclone".net arayüzü İCloneable, ama bu iyi belgelenmiş ve ekip içinde iyi anlaşılır olduğundan emin olun. Şahsen çerçeve kuralları kullanmaya devam ederdim.)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:
C#

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • My name is Festis and I'm free

    My name is F

    2 EKİM 2011
  • pucksz

    pucksz

    24 Mart 2006
  • WK

    WK

    9 Ocak 2006