Güzel soru! Günlük olarak C # yapmayanlar için biraz daha uzun bir açıklama eklemek istiyorum ... çünkü soru genel olarak ad çözümleme sorunlarının iyi bir hatırlatıcısıdır.
Aşağıdaki şekillerde biraz değiştirilmiş orijinal kodu alın:
- Orijinal ifadedeki gibi karşılaştırmak yerine tür adlarını yazdıralım (ör.
return this is Sparta
) .
- Arayüzü tanımlayalım
Athena
.Place
Arayüz adı çözümlemesini göstermek üst sınıfta .
- Ayrıca , her şeyi çok netleştirmek
this
için Sparta
sınıfta bağlı olduğu gibi tür adını da yazdıralım .
Kod şuna benzer:
public class Place {
public interface Athena { }
}
public class Sparta : Place
{
public void printTypeOfThis()
{
Console.WriteLine (this.GetType().Name);
}
public void printTypeOfSparta()
{
Console.WriteLine (typeof(Sparta));
}
public void printTypeOfAthena()
{
Console.WriteLine (typeof(Athena));
}
}
Şimdi bir Sparta
nesne oluşturuyoruz ve üç yöntemi çağırıyoruz.
public static void Main(string[] args)
{
Sparta s = new Sparta();
s.printTypeOfThis();
s.printTypeOfSparta();
s.printTypeOfAthena();
}
}
Elde ettiğimiz çıktı:
Sparta
Athena
Place+Athena
Ancak, Place sınıfını değiştirir ve Sparta arabirimini tanımlarsak:
public class Place {
public interface Athena { }
public interface Sparta { }
}
o zaman bu Sparta
- arayüz - ilk önce ad arama mekanizmasına sunulacak ve kodumuzun çıktısı şu şekilde değişecek:
Sparta
Place+Sparta
Place+Athena
Bu nedenle, sayfadaki tür karşılaştırmasını etkili bir şekilde MakeItReturnFalse
, ilk önce ad çözümlemesiyle bulunan, süper sınıfta Sparta arayüzünü tanımlayarak, fonksiyon tanımındaki .
Peki C # neden ad çözümlemesinde süper sınıfta tanımlanan arayüzlere öncelik vermeyi seçti? @JonSkeet biliyor! Cevabını okursanız, ad çözümleme protokolünün ayrıntılarını C # olarak alacaksınız.