2009-05-02 18 views
19

Tôi đang tạo một lớp proxy chuyên dụng triển khai IList<T> và kết thúc một phiên bản List<T> nội bộ.Danh sách <T> đặt IsReadOnly ở chế độ riêng tư như thế nào khi IsReadOnly là một thành viên giao diện?

List<T> tự thực hiện IList<T>, mà tuyên bố thành viên bool IsReadOnly, nhưng khi tôi cố gắng truy cập vào thành viên đó từ lớp của riêng tôi, tôi không thể bởi vì trong List<T>, IsReadOnly là tư nhân.

Vì vậy, câu hỏi của tôi là; nếu việc triển khai giao diện yêu cầu tất cả các thành viên được triển khai phải công khai, thì tại sao List<T> thực hiện IsReadOnly là riêng tư và do đó từ chối truy cập vào nó?

+0

Xin cảm ơn tất cả ba câu trả lời đều hữu ích :) –

+0

Câu trả lời tuyệt vời như thế nào. Tiếp theo - tại sao? ; ^) – ruffin

Trả lời

23

Nó triển khai thành viên giao diện một cách rõ ràng.

http://msdn.microsoft.com/en-us/library/aa288461(VS.71).aspx

Lưu ý rằng điều này không làm cho các thành viên giao diện private. Nó vẫn có sẵn công khai, nhưng chỉ khi bạn nhìn vào đối tượng thông qua giao diện (với đúc).

+1

Điều này chỉ thổi tâm trí của tôi. * chỉnh sửa *: Tôi vừa nhận ra đây là cách chúng ta giải quyết vấn đề "hai giao diện với cùng một phương thức". Bây giờ tôi cảm thấy ngớ ngẩn. Tôi chưa bao giờ nghĩ đến việc sử dụng cách thực hiện rõ ràng như một hình thức ẩn phương thức. #dotnetisawesome –

12

Lý do có thể làm điều này là nó sử dụng triển khai giao diện rõ ràng.

bool IList<T>.IsReadOnly { get { ... } } 

Thành viên này vẫn có thể truy cập, nhưng chỉ có thể truy cập thông qua loại IList<T>.

List<T> list = ...; 
bool isReadOnly = ((IList<T>)list).IsReadOnly; 

Khi triển khai IList<T>, loại không hứa sẽ cung cấp giá trị IsReadOnly. Thay vào đó, nó hứa sẽ cung cấp một thuộc tính IsReadOnly khi được xem là IList<T>. Có hay không nó cung cấp nó trên lớp thực tế là trước đây là một sự lựa chọn của tác giả loại.

+1

@JaredPar: Bạn không thể khai báo một công cụ sửa đổi truy cập trên EII. –

+0

@Mehrdad, vâng tôi nhận được điều đó rất nhiều. VB và C# có hành vi khác nhau ở đây. – JaredPar

6

Đối với trường hợp nếu List<T>, IsReadOnly không thực sự hợp lý: luôn là false. List do đó thực hiện giao diện ICollection<T> (và giao diện IList) một cách rõ ràng, do đó làm cho giao diện "riêng tư" để sử dụng bình thường. Nếu bạn vẫn cần truy cập vào nó, bạn có thể thông qua một dàn diễn viên rõ ràng đến giao diện:

bool result = ((ICollection<string>)yourStringList).IsReadOnly; 
// Or equivalently using `IList`. 
Các vấn đề liên quan