SORU
2 EKİM 2009, Cuma


Neden bu polimorfik mu C# nedir?kod yazdırma

Son zamanlarda OOP Polymorphism Inheritance anlamak için sıralama-bir yap-boz gibi, aşağıdaki parça kodu verildi - C#.

// No compiling!
public class A
{
     public virtual string GetName()
     {
          return "A";
     }
 }

 public class B:A
 {
     public override string GetName()
     {
         return "B";
     }
 }

 public class C:B
 {
     public new string GetName()
     {
         return "C";
     }
 }

 void Main()
 {
     A instance = new C();
     Console.WriteLine(instance.GetName());
 }
 // No compiling!

Şimdi, bir süre sonra, uzun puzzle sunan başka bir geliştirici ile sohbet çıktı ne olduğunu biliyorum, ama ben alışkanlık senin için berbat. Gerçekten sahip olduğum tek sorun, miras, vs .. ne kodu adım adım nasıl çıktı, alacağız.

C tanımlanan sınıf gibi görünüyor olarak iade olacağını düşündüm. Sonra gittim kafamı olmadığı B döndürülür çünkü C devralır B - ama B de devralır A (neresi var karışık!).

< / ^ hr .

Soru:

Herkes polimorfizmi ve devralma çıktı alınıyor, sonunda ekranda kendi paylarına düşeni nasıl açıklayabilir?

CEVAP
2 EKİM 2009, Cuma


Bunu düşünmek için doğru yolu her sınıf nesnelerini belirli sayıda yapılmasını gerektiren, hayal etmektir "yuva"; bu yuva yöntemleri ile doldurulur. "Size iki şey anlamak gerekir: . "ne yöntem aslında çağrılır? soru

  1. Her bir yuva içeriği nedir?
  2. Hangi slot denir?

Başlangıç yuvaları dikkate alarak yapalım. İki yuva vardır. Bir tüm örneklerini GetNameSlotA ararız bir yuva gerekli. C tüm örneklerini GetNameSlotC ararız bir yuva gerekli. Bu ne "" C-bildirisi " ne demek; "yeni bir yuva istiyorum". yeni Karşılaştırıldığında, "" B, anlamına gelir beyanı "yeni bir yuva istemiyorum, istiyorum yeniden kullanım GetNameSlotA" geçersiz kılar.

Tabii ki, C C da bir slot GetNameSlotA olmalı yani Bir ' devralır. Bu nedenle, C örneklerini iki yuva -- GetNameSlotA ve GetNameSlotC. C-veya B örneklerini bir yuva, GetNameSlotA.

Yeni bir C oluştururken şimdi, bu iki yuva içine ne gider? GetNameA, GetNameB ve GetNameC ararız olan üç yöntem vardır.

Bir Bildirgesi "diyor GetNameSlotA koymak GetNameA". C bir üst sınıf, Bir kuralı C. için geçerlidir

B Bildirgesi "diyor GetNameSlotA koymak GetNameB". B ve C sınıf, B kuralı C örnekleri için geçerlidir Şimdi arasında bir çatışma var ve B. B -- B kuralı kazanç daha türetilmiş bir türgeçersiz kılarBir kural. Dolayısıyla kelime "geçersiz" yayınlamıştır.

C Bildirgesi "diyor GetNameSlotC koymak GetNameC".

Bu nedenle, yeni C iki yuva bulunur. GetNameSlotA GetNameB içerir ve GetNameSlotC GetNameC içerir.

Şimdi yöntemleri ne yuvası ne karar verdik, ilk soruyu cevapladık.

Şimdi ikinci soruya cevap vermek zorundayız. Ne yuvası denir?

Derleyici gibi düşün. Bir değişken var. Onun hakkında bildiğin tek tip bir yöntem bu değişken Ara gidermek için sorulan A. olmasıdır. Yuvaları bir Bir, mevcut ve maçlar GetNameSlotA olduğunu bulabilirsiniz tek slot bak. Sadece A tipi değişken; neden sadece C için geçerli yuvaları için bakar mısın? çünkü hakkında GetNameSlotC bilmiyorsun.

Bu nedenle bu GetNameSlotA ne olursa olsun bir çağrıdır. Zaten zamanında, GetNameB yuvası olacağına karar verdik. Bu nedenle, bu GetNameB için bir çağrıdır.

Anahtar paket servisi olan restoran buradaC# aşırı çözümleme bir yuva seçerve o yuvanın içinde ne olursa olsun, bir çağrı oluşturur.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Benjamin Heckendorn

    Benjamin Hec

    4 Mayıs 2008
  • Eric Anthony

    Eric Anthony

    13 AĞUSTOS 2011