SORU
25 HAZİRAN 2010, Cuma


Neden yeni bir anahtar gerekiyor ve neden varsayılan davranışı geçersiz kılmak ve gizlemek için değil mi?

blog post buna bakıyor ve soruları takip ediyordum:

  • Neden new anahtar sözcük ihtiyacımız var, sadece temel sınıf yöntemi gizli olduğunu belirtmek için. Neden ihtiyacımız olsun ki? override anahtar kelimeyi kullanmayız bile, temel sınıf yöntemi saklıyoruz değil mi?
  • Neden C varsayılan değer# gizlemek için değil, üzerine yazılsın mı? Neden tasarımcılar bu şekilde uyguladınız?

CEVAP
25 HAZİRAN 2010, Cuma


İyi soru. Beni yeniden devlet onlara izin.

Neden başka bir yöntem ile bir yöntem gizlemek için yasal mı?

Bana bu sorunun cevabını bir örnek üzerinde görelim. CLR v1: bir arayüzü var

interface IEnumerable
{
    IEnumerator GetEnumerator();
}

Süper. Jenerik ve sanırım şimdi CLR v2 v1 in jenerik yapabiliriz sadece "adam, bu genel bir arayüz yapardım. Ama yapmadım. Bir şey ile uyumlu şimdi yapmalıyımIEnumerable beklediği kodu ile geriye dönük uyumluluk kaybetmeden jenerik yararları, bu yüzden bir genel."

interface IEnumerable<T> : IEnumerable
{
    IEnumerator<T> .... uh oh

IEnumerable<T> GetEnumerator yöntemini çağırmak için ne yapacaksın? Unutma, senistiyorumgizlemek genel olmayan temel arayüz için GetEnumerator. Sanaaslaaçıkça geriye dönük uyumluluğu bir durum olmadıkça o şey denmesini istiyor.

Yalnız bu yöntem gizleme haklı. Yöntem saklandığı yerden gerekçeleri üzerinde daha fazla düşünce için my article on the subject bkz.

Neden "yeni" neden bir uyarı olmadan mı? saklanıyor mu

Bir şeyler saklıyorsun ve yanlışlıkla yapıyor olabilir dikkatinize getirmek istiyorum çünkü.Unutmayın, yanlışlıkla bir şey türetilmiş bir sınıfı düzenleyerek temel sınıf düzen bir başkası tarafından yapılması nedeniyle, yerine saklanıyor olabilir.

Neden "yeni" bir uyarı yerine bir hata olmadan mı? saklanıyor

Aynı sebepten. Yanlışlıkla sadece bir temel sınıf yeni bir sürümünü almışsın çünkü bir şey saklıyor olabilir. Bu her zaman olur. FooCorp sınıf B. müşterileri bu yöntemi gibi çünkü BarCorp yöntem bir Bar ile türetilmiş sınıf D yapar, bir temel yapar. FooCorp görür ve hey, bu iyi bir fikir, işlevi temel sınıf oldu diyor. Onlar kendi yöntemi şimdi temel sınıf yöntemi gizlediğini söylemiş olsalardı iyi olurdu ve gemi BarCorp yeni sürümünü aldığında foo.dll ve yeni bir versiyonu.

Bu durum bir olmak istiyoruzuyarıve bir değilhatabu bir hata yapmak anlamına gelir çünkübu kırılgan temel sınıf sorunu başka bir şeklidir. C# biri bir temel sınıf için bir değişiklik yaptığında, türetilen bir sınıfı kullanan kod üzerindeki etkileri en aza şekilde tasarlanmıştır.

Neden saklanıyor ve varsayılan geçersiz mi?

Sanal geçersiz kılar çünkütehlikeli. Sanal geçersiz türetilmiş sınıflar temel sınıf kullanmak için derlenmiş kod davranışını değiştirmenizi sağlar. Geçersiz kılma yapmak gibi tehlikeli bir şey yaptıklarını yaptığınız bir şey olmalıdırbilinçli olarakvekastenkaza değil.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ben Vivona

    Ben Vivona

    24 Ocak 2010
  • undrmyumbrellaa

    undrmyumbrel

    25 Temmuz 2012
  • YEAH1TV

    YEAH1TV

    19 ŞUBAT 2009