ICloneable'ı c # uygulamasına neden uygulamalıyım?


111

Metodu neden miras almam ICloneableve uygulamam gerektiğini bana açıklar Clone()mısınız?

Derin bir kopya yapmak istersem, sadece yöntemimi uygulayamaz mıyım? Diyelim MyClone()mi?

Neden miras almalıyım ICloneable? Avantajları nelerdir? Bu sadece kodu "daha okunabilir" yapma meselesi mi?


Yanıtlar:


117

Yapmamalısın. Yönteminizin "derin" veya "sığ" bir klon gerçekleştirip gerçekleştirmediğine ICloneabledair arayüzden net bir gösterge olmadığı için Microsoft uygulamaya karşı tavsiyede bulunur Clone.

Daha fazla bilgi için 2003 yılında (!) Brad Abrams'ın bu blog gönderisine bakın .


4
Şimdi 404 olan makaleye geri dönüş bağlantısı: web.archive.org/web/20040419170407/http://blogs.msdn.com/brada/…
harpo


29

ICloneableArayüz kendisi tarafından bir nesne bu konuda başka bir şey bilmeden kopyalanabilen olduğunu bilmek yararlıdır nerede gerçekten birçok durum var olmadığını söylemek olan, çok kullanışlı değildir. Bu, örneğin IEnumerableveya IDisposable; IEnumerableNasıl numaralandırılacağından başka hiçbir şey bilmeden kabul etmenin yararlı olduğu birçok durum vardır .

Öte yandan, diğer ICloneablekısıtlamalarla birlikte genel bir sınırlama olarak uygulandığında yararlı olabilir. Örneğin, bir temel sınıf yararlı bir şekilde bir dizi türevi destekleyebilir, bunlardan bazıları yararlı bir şekilde klonlanabilir ve bazıları olamaz. Temel türün kendisi bir genel klonlama arayüzünü açığa çıkarsa, klonlanamayan herhangi bir türev türü Liskov İkame İlkesini ihlal eder. Bu sorunu önlemenin yolu, temel tipin Korumalı bir yöntem kullanarak klonlamayı desteklemesi ve türetilmiş türlerin uygun gördükleri şekilde genel bir klonlama arabirimi uygulamasına izin vermektir.

Bu gerçekleştirildikten sonra, bir WonderfulBasetürden bir nesneyi kabul etmek isteyen ve onu klonlayabilmesi gereken bir yöntem, klonlamayı destekleyen bir WonderfulBase nesnesini kabul edecek şekilde kodlanabilir (temel tür ve ICloneablekısıtlamalara sahip genel bir tür parametresi kullanılarak ) . Her ne kadar ICloneablearayüz kendisi derin veya sığ klonlama işaret olmaz, belgelerine WonderfulBasekopyalanabilen belirtmek istiyorum WonderfulBase, derin veya sığ-klonlanmış olmalıdır. Esasen, ICloneablearayüz, ICloneableWonderfulBaseher farklı klonlanabilir temel sınıf için farklı adlar tanımlamak zorunda kalmaması dışında, tanımlayarak başarılamayacak hiçbir şeyi başaramazdı .


18

ICloneableBCL'deki tartışmalı eserlerden biridir. IMHO'nun bunu uygulaması için gerçek bir neden yok. Bununla birlikte, bir klon yöntemi oluşturacaksam, o zaman uygularım ICloneableve kendi güçlü tiplenmiş sürümümü sağlarım Clone.

Sorun , çok farklı şeyler olan sığ veya derin bir kopya olup ICloneableolmadığının asla belirtilmemesidir Clone. Hiçbir olduğu gerçeği ICloneable<T>ICloneable hakkında Microsoft'un düşünceleri üzerinde belirtisi olabilir


9

Matt haklı, kullanma. Kendi Copy()yönteminizi (veya benzer adınızı) oluşturun ve yönteminizin nesnenizin derin veya yüzeysel bir kopyasını oluşturup oluşturmadığını herkese açık API'nizde tamamen netleştirin .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.