2014-07-24 20 views
12

Tôi đang xem tờ khai của List<T> và thấy rằng nó thực hiện IList<T>, ICollection<T>IEnumerable<T> (trong số những người khác).Tại sao một giao diện thực hiện một giao diện khác?

Sau đó, tôi đã đi để tìm định nghĩa của IList<T> và thấy rằng nó thực hiện ICollection<T>IEnumerable<T>.

Điểm của giao diện triển khai giao diện khác nếu chúng hoạt động giống như "hợp đồng" và chúng tôi không viết mã số thực vào chúng?

Triển khai này có tích lũy không? Nếu có, kể từ IList<T> thực hiện ICollection<T>IEnumerable<T>, List<T> không được triển khai chỉ IList<T>?

Xin lỗi nếu câu hỏi của tôi là khó hiểu, tôi là một bit litte bối rối ngay bây giờ.

+4

Đó là để dễ đọc. Bạn không cần phải đi xa hơn để xem các hợp đồng quan trọng nhất. Nó cũng đảm bảo các hợp đồng không thay đổi đáng kể nếu 'ICistection ' – zerkms

+2

thực sự là một giao diện không thực hiện bất cứ điều gì nhưng nó có thể kế thừa từ các giao diện khác –

+1

@zerkms: Bạn nên làm cho câu trả lời đó! – Ryan

Trả lời

18

Điểm của giao diện triển khai giao diện khác nếu chúng hoạt động giống như "hợp đồng" và chúng tôi không viết mã thực sự cho chúng?

Giao diện hỗ trợ kế thừa và tạo điều kiện cho đa hình giống như cách các lớp học thực hiện. An IList<T> cũng là một ICollection<T>, giống như cách mà TextBoxControl.

Triển khai này có tích lũy không? Nếu có, vì IList triển khai ICollection và IEnumerable, Danh sách không được triển khai chỉ IList?

Như những người khác đã chỉ ra, điều này chủ yếu là để dễ đọc và bảo trì. Có, thừa kế là tích lũy. Tuy nhiên, khi một lớp thực hiện nhiều giao diện chứa các thành viên có cùng chữ ký, nó chỉ cần xác định một thành viên cho tất cả các triển khai. Explicit interface implementation có thể được sử dụng để xác định rõ ràng một thành viên cho một triển khai cụ thể.

8

Ít nhất nó làm giảm dự phòng.

public interface INamedObject { string Name { get; } } 
public interface IValuedObject<T> { T Value { get; } } 
public interface INamedValuedObject<T> : INamedObject, IValuedObject<T> { } 

là thiết kế tốt hơn:

public interface INamedObject { string Name { get; } } 
public interface IValuedObject<T> { T Value { get; } } 
public interface INamedValuedObject<T> { 
    string Name { get; } 
    T Value { get; } 
} 

Ngoài ra, trong các trường hợp sau, nhận thấy rằng một INamedValuedObject<T> nay không phải là một INamedObject cũng không một IValuedObject<T>.

Bạn có thể đọc trường hợp cũ là "Cái gì đó là INamedValuedObject<T> là một cái gì đó là INamedObject, một số IValuedObject<T> và cũng có các yếu tố sau".

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