Pertanyaan yang indah! Saya ingin menambahkan penjelasan yang sedikit lebih panjang untuk mereka yang tidak melakukan C # setiap hari ... karena pertanyaan ini merupakan pengingat yang baik tentang masalah resolusi nama secara umum.
Ambil kode aslinya, sedikit dimodifikasi dengan cara berikut:
- Mari kita cetak nama tipe daripada membandingkannya seperti pada ekspresi asli (yaitu
return this is Sparta
).
- Mari tentukan antarmuka
Athena
di filePlace
superclass untuk mengilustrasikan resolusi nama antarmuka.
- Mari kita juga mencetak nama tipe
this
karena terikat di Sparta
kelas, hanya untuk memperjelas semuanya.
Kodenya terlihat seperti ini:
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));
}
}
Kami sekarang membuat Sparta
objek dan memanggil tiga metode.
public static void Main(string[] args)
{
Sparta s = new Sparta();
s.printTypeOfThis();
s.printTypeOfSparta();
s.printTypeOfAthena();
}
}
Output yang kami dapatkan adalah:
Sparta
Athena
Place+Athena
Namun, jika kita memodifikasi kelas Place dan mendefinisikan antarmuka Sparta:
public class Place {
public interface Athena { }
public interface Sparta { }
}
maka inilah Sparta
- antarmuka - yang akan tersedia terlebih dahulu untuk mekanisme pencarian nama dan keluaran kode kita akan berubah menjadi:
Sparta
Place+Sparta
Place+Athena
Jadi kami secara efektif mengacaukan perbandingan tipe dalam MakeItReturnFalse
definisi fungsi hanya dengan mendefinisikan antarmuka Sparta di superclass, yang ditemukan pertama kali oleh resolusi nama.
Tetapi mengapa C # memilih untuk memprioritaskan antarmuka yang ditentukan dalam superclass dalam resolusi nama? @JonSet tahu! Dan jika Anda membaca jawabannya, Anda akan mendapatkan detail dari protokol resolusi nama di C #.