Câu hỏi hay! Tôi muốn thêm một lời giải thích dài hơn một chút cho những người không làm C # hàng ngày ... bởi vì câu hỏi là một lời nhắc nhở tốt về các vấn đề phân giải tên nói chung.
Lấy mã gốc, được sửa đổi một chút theo những cách sau:
- Hãy in ra các tên kiểu thay vì so sánh chúng như trong biểu thức ban đầu (tức là
return this is Sparta
).
- Hãy xác định giao diện
Athena
trong Place
lớp cha để minh họa độ phân giải tên giao diện.
- Cũng hãy in ra tên kiểu của
this
nó được ràng buộc trong Sparta
lớp, chỉ để làm cho mọi thứ thật rõ ràng.
Mã trông như thế này:
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));
}
}
Bây giờ chúng ta tạo một Sparta
đối tượng và gọi ba phương thức.
public static void Main(string[] args)
{
Sparta s = new Sparta();
s.printTypeOfThis();
s.printTypeOfSparta();
s.printTypeOfAthena();
}
}
Đầu ra chúng tôi nhận được là:
Sparta
Athena
Place+Athena
Tuy nhiên, nếu chúng ta sửa đổi lớp Place và xác định giao diện Sparta:
public class Place {
public interface Athena { }
public interface Sparta { }
}
thì nó Sparta
- giao diện - sẽ có sẵn đầu tiên cho cơ chế tra cứu tên và đầu ra mã của chúng tôi sẽ thay đổi thành:
Sparta
Place+Sparta
Place+Athena
Vì vậy, chúng ta đã nhầm lẫn hiệu quả với việc so sánh kiểu trong MakeItReturnFalse
định nghĩa hàm chỉ bằng cách xác định giao diện Sparta trong lớp cha, được tìm thấy đầu tiên bằng độ phân giải tên.
Nhưng tại sao C # lại chọn ưu tiên các giao diện được xác định trong lớp cha trong độ phân giải tên? @JonSkeet biết! Và nếu bạn đọc câu trả lời của anh ấy, bạn sẽ nhận được chi tiết của giao thức phân giải tên trong C #.