คำถามสวย! ฉันต้องการเพิ่มคำอธิบายที่ยาวขึ้นเล็กน้อยสำหรับผู้ที่ไม่ได้ทำ C # ในแต่ละวัน ... เนื่องจากคำถามนี้เป็นข้อเตือนใจที่ดีเกี่ยวกับปัญหาการแก้ปัญหาชื่อโดยทั่วไป
ใช้รหัสเดิมแก้ไขเล็กน้อยด้วยวิธีต่อไปนี้:
- มาพิมพ์ชื่อประเภทแทนการเปรียบเทียบเหมือนในนิพจน์ดั้งเดิม (เช่น
return this is Sparta
)
- มากำหนดอินเทอร์เฟซ
Athena
ในPlace
ซูเปอร์คลาสเพื่อแสดงความละเอียดของชื่ออินเทอร์เฟซ
- ลองพิมพ์ชื่อประเภท
this
ที่ถูกผูกไว้ในSparta
คลาสด้วยเพื่อให้ทุกอย่างชัดเจน
รหัสมีลักษณะดังนี้:
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));
}
}
ตอนนี้เราสร้างSparta
วัตถุและเรียกใช้วิธีการทั้งสาม
public static void Main(string[] args)
{
Sparta s = new Sparta();
s.printTypeOfThis();
s.printTypeOfSparta();
s.printTypeOfAthena();
}
}
ผลลัพธ์ที่เราได้รับคือ:
Sparta
Athena
Place+Athena
อย่างไรก็ตามหากเราแก้ไขคลาส Place และกำหนดอินเทอร์เฟซ Sparta:
public class Place {
public interface Athena { }
public interface Sparta { }
}
จากนั้นก็คือสิ่งนี้Sparta
- อินเทอร์เฟซ - ที่จะพร้อมใช้งานก่อนสำหรับกลไกการค้นหาชื่อและผลลัพธ์ของรหัสของเราจะเปลี่ยนเป็น:
Sparta
Place+Sparta
Place+Athena
ดังนั้นเราจึงสับสนอย่างมีประสิทธิภาพกับการเปรียบเทียบประเภทใน MakeItReturnFalse
นิยามฟังก์ชันเพียงแค่กำหนดอินเทอร์เฟซ Sparta ในซูเปอร์คลาสซึ่งพบได้ก่อนโดยการแก้ชื่อ
แต่เหตุใด C # จึงเลือกจัดลำดับความสำคัญของอินเทอร์เฟซที่กำหนดไว้ใน superclass ในการแก้ปัญหาชื่อ @JonSkeet รู้! และถ้าคุณอ่านคำตอบของเขาคุณจะได้รับรายละเอียดของโปรโตคอลการแก้ไขชื่อใน C #