Mã sau có nên đưa ra cảnh báo không?Tại sao phương pháp tĩnh của tôi ẩn phương pháp thể hiện của tôi?
class Foo { public void Do() { /*...*/ } /*...*/ }
class Bar : Foo { public static void Do() { /*...*/ } /*...*/ }
Nó cung cấp cho:
"Cảnh báo CS0108:.. 'Bar.Do()' ẩn thành viên được thừa hưởng 'Foo.Do()' Sử dụng các từ khóa mới nếu trốn được dự định"
Nếu tôi thực hiện một sự thay đổi để mã:
class Foo { public static void Do() { /*...*/ } /*...*/ }
class Bar : Foo { public void Do() { /*...*/ } /*...*/ }
Tôi nhận được cảnh báo tương tự.
Nếu tôi thực hiện thay đổi sau, cảnh báo sẽ biến mất.
class Foo { public void Do() { /*...*/ } /*...*/ }
class Bar : Foo { new public static void Do() { /*...*/ } /*...*/ }
Hãy để tôi thực hiện thay đổi thêm:
class Foo { public void Do() { /*...*/ } /*...*/ }
class Bar : Foo {
new public static void Do()
{ new Bar().Do();/*...*/ } /*...*/
}
này không biên dịch:
"Lỗi CS0176: Thành viên 'Bar.Do()' không thể được truy cập với một thể hiện tham chiếu; thay vào đó, hãy hội đủ điều kiện với tên loại. "
Vì vậy, tôi mất quyền truy cập vào phương thức kế thừa của mình thông qua tham chiếu mẫu từ phương pháp tĩnh!
Điều gì sẽ là logic đằng sau nó? Hay tôi đã đánh máy ở đâu đó?
Tôi đã xem xét điều này khi tôi cố gắng xác định phương pháp tĩnh 'Hiển thị' cho biểu mẫu của tôi bắt nguồn từ 'Biểu mẫu'.
Xin chào Jon, +1 để trả lời. Tôi nghĩ rằng, từ góc độ người dùng ngôn ngữ, lỗi là cách chọn phương pháp tốt nhất để gọi :-). Với tôi, "new Bar(). Do()" cho biết rõ ràng phương thức nào đang được gọi lúc biên dịch và không cần phải tạo ra lỗi! – isntn
Tôi nghi ngờ cách thay thế là làm cho ngôn ngữ phức tạp hơn nhiều. Có những trường hợp khá thường xuyên có thể được cải thiện nếu ngôn ngữ thông minh hơn - nhưng sau đó sẽ khó hơn để "biết" ngôn ngữ tốt, và cũng để thực hiện chính xác nó trong trình biên dịch. Đó là tất cả sự cân bằng ... –