2015-03-20 17 views
5

Tại sao IList định nghĩa như thế này?Tại sao IList <T> thực hiện IEnumerable và ICollection <T><T> khi ICollection <T> tự thực hiện IEnumerable <T>

public interface IList<T> : ICollection<T>, IEnumerable<T>, IEnumerable 

public interface ICollection<T> : IEnumerable<T>, IEnumerable 

public interface IEnumerable<T> : IEnumerable 

Không thể nó chỉ là

public interface IList<T> : ICollection<T> 

Vì vậy, để kiểm tra tôi tạo ra các giao diện, chỉ để đảm bảo nếu mà làm việc!

public interface IOne 
{ 
    string One(); 
} 

public interface ITwo : IOne 
{ 
    string Two(); 
} 

public interface IThree : ITwo, IOne 
{ 
    string Three(); 
} 

Trong khi hoàn toàn tốt, Resharper than phiền về "Giao diện thừa".

Mọi ý tưởng tại sao Microsoft tiếp tục triển khai này?

+1

Bạn đã thấy bản sao ở đâu? (Nguồn của bạn là gì cho nguồn 'IList ', vậy để nói?) –

+0

@JonSkeet: Chỉ cần nhấn' F12'/'Đi tới định nghĩa' trên' IList '. Nó cho tôi thấy 'chữ ký phương thức' từ' metadata metadata'. Chỉ cần xem nó từ đó. –

+1

Như một sang một bên, nó rất hữu ích để chỉ sử dụng backticks cho những thứ mà thực sự mã. (Tôi đã chỉnh sửa các bit thừa trong bài đăng của bạn) –

Trả lời

9

Giao diện "kế thừa" là một trong những thuật ngữ gây hiểu lầm nhất trong kỹ nghệ phần mềm. Bạn đã không kế thừa squat, giao diện không có bất kỳ thực hiện, do đó bạn không thể kế thừa nó. Bạn chỉ kế thừa yêu cầu để triển khai các phương pháp.

Thêm vào nhu cầu đó bằng cách lặp lại tuyên bố giao diện không thay đổi bất cứ điều gì, bạn đã có nhu cầu và thêm một yêu cầu bổ sung không tạo ra sự khác biệt nào. Vì vậy, kể từ khi nó không quan trọng, Microsoft helpfully chỉ lặp lại giao diện để bạn có thể nói trong một ngã swoop những gì các giao diện được thực hiện bởi, nói, Danh sách. Bạn không cần phải đi sâu vào khai báo giao diện để thấy rằng danh sách thực hiện IEnumerable là tốt. Đó là một kiểu mã hóa tự viết, được khuyến nghị.

Hãy cẩn thận với mặt khác của huy chương này, có thể triển khai hai giao diện riêng biệt với cùng một phương pháp chính xác chỉ bằng cách thực hiện phương pháp duy nhất. Trong khi đó thường là hữu ích, đôi khi đó không phải là những gì bạn muốn. Nói, ICowboy và IPainter, cả hai đều có một phương thức Draw(). Nó không nên làm điều tương tự :) Bạn sau đó phải quay trở lại một thực hiện rõ ràng để tránh sự mơ hồ.

Giải quyết khiếu nại Resharper, điều này không thực sự hữu ích. Resharper có xu hướng giả định tồi tệ nhất từ ​​một lập trình viên. Nhưng nếu bạn muốn tắt nó sau đó bạn cần phải loại bỏ IOne từ danh sách thừa kế IThree, nó là dư thừa. Điều tương tự cho lớp thực hiện IThree, bạn cũng cần phải loại bỏ ITwo và IOne khỏi danh sách thừa kế. Hoặc chỉ tắt cảnh báo.

+2

điểm tốt => đề xuất phong cách tự viết tư liệu. –

+1

Cảm ơn @Hans.Ngoài ra, 'Eric Lippert' giải thích điều này đẹp ở đây' http: // blogs.msdn.com/b/ericlippert/archive/2011/04/04/so-many-interfaces.aspx # comments' –

Các vấn đề liên quan