Nếu thực tế là cách duy nhất để làm điều này là bằng cách sử dụng các từ khóa new
phiền bạn, sau đó theo ý kiến của tôi bạn đang suy nghĩ về giao diện sai.
Chắc chắn, bạn có thể nói rằng IInherited
"được kế thừa từ" IBase
; nhưng điều đó thực sự là gì có nghĩa là? Đây là những giao diện; họ thiết lập các hợp đồng mã. Bằng cách ẩn thuộc tính IBase.Property1
với new string Property1 { get; set; }
, bạn không bị che khuất bất kỳ chức năng nào. Vì vậy, lý do truyền thống mà rất nhiều nhà phát triển coi là ẩn là một điều "xấu" - rằng nó vi phạm đa hình - là không liên quan trong trường hợp này.
Hãy tự hỏi: những gì thực sự vấn đề khi nói đến giao diện? Họ cung cấp một đảm bảo đáp ứng các cuộc gọi phương thức nhất định, phải không?
Vì vậy, với hai giao diện sau:
interface IBase
{
string Property1 { get; }
}
interface IInherited : IBase
{
new string Property1 { set; }
}
- Nếu một đối tượng thực hiện
IBase
, bạn có thể đọc tài sản Property1
của nó.
- Nếu một đối tượng thực hiện
IInherited
, bạn có thể đọc thuộc tính Property1
của nó (giống như thực hiện IBase
) và bạn cũng có thể ghi vào đó.
Một lần nữa, thực sự không có vấn đề gì ở đây.
Nguồn
2010-08-18 20:36:02
Tôi nghĩ có sự nhầm lẫn ở đây giữa thừa kế các lớp và kế thừa giao diện. Một giao diện không thực sự kế thừa một giao diện khác trong cùng một lớp là thừa hưởng một lớp khác. Tất cả các mã của bạn được nói là IInherited cũng thực hiện IBase. Mã này là tốt, nó chỉ làm tăng một cảnh báo trình biên dịch bởi vì bạn đang thay đổi chữ ký của Property1 trong giao diện. Bạn có thể xóa điều này bằng mới. –
Như đã lưu ý bởi nhiều người khác, cú pháp này là không thể, nhưng tôi cảm thấy rằng nó nên được. Nếu bạn sử dụng Reflection trên Property1 thì sẽ có một phương thức Property1_get và một phương thức Property1_set, vì vậy về mặt logic có vẻ như bạn sẽ có thể thực hiện chúng một cách riêng biệt. Và việc thiếu khả năng làm như vậy chắc chắn sẽ khiến tôi lặp lại mã đôi khi (hoặc đưa lên từ khóa mới). – cedd