2016-05-10 15 views
6

Tôi không rõ ràng về cú pháp thừa kế cho giao diện trong C#.Khai báo kế thừa giao diện trong C#

Ví dụ:

public interface IQux : IBar 
{ 
} 

và điều này::

public interface IQux : IBar, IFoo 
{ 
} 

Hoặc, cho một ví dụ thế giới thực, Tại sao ICollection<T> tuyên bố

public interface IFoo 
{ 
} 
public interface IBar : IFoo 
{ 
} 

sự khác biệt giữa điều này là gì như thế này:

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

thay vì điều này:

public interface ICollection<T> : IEnumerable<T> 

cho rằng IEnumerable<T> đã được thừa hưởng từ IEnumerable?

+0

Câu hỏi hay của nó –

+1

Không cần phải liệt kê rõ ràng các giao diện cơ sở như được triển khai, nhưng nó rất tốt cho sự rõ ràng. IOW, không có sự khác biệt về chức năng. – Blorgbeard

+0

đồng ý với @Blorgbeard, không có sự khác biệt, chỉ tốt cho sự rõ ràng –

Trả lời

5

Eric Lippert giải thích nó rất tốt trong bài viết này:

https://blogs.msdn.microsoft.com/ericlippert/2011/04/04/so-many-interfaces

Nếu IBar thừa hưởng từ IFoo, sau đó, từ quan điểm của trình biên dịch, không có sự khác biệt giữa:

public interface IQux : IBar 
{ 
} 

và điều này:

public interface IQux : IBar, IFoo 
{ 
} 

Bạn có thể chọn để nêu rằng IQux kết hợp IFoo nếu bạn nghĩ nó làm cho mã dễ đọc hơn. Hoặc bạn co thể chọn không lam.

2

Generics không tồn tại ngay từ đầu - nhìn vào các tài liệu C# 1.0 và bạn sẽ không thấy IEnumerable<T>.

Về câu hỏi thứ nhất: không có sự khác biệt (thậm chí không có hiện thực giao diện rõ ràng như xa như Tôi có thể kể).

Conside này:

public interface IFoo 
{ 
    void M(); 
} 

public interface IBar : IFoo { } 
public interface IQux : IBar, IFoo { } 
public interface IQux2 : IBar { } 

// Both work: 
// class X : IQux 
class X : IQux2 
{ 
    void IFoo.M() { } 
} 
+0

^^ Những gì anh ta nói. Mặc dù tôi nghĩ rằng đôi khi nó đi xuống đến cách bạn muốn sử dụng giao diện của bạn. Bạn có thể muốn thực thi một lớp thực hiện IBar để thực hiện IFoo. Hoặc có thể có điều gì đó về IFoo không có ý nghĩa đối với IBar. Tôi nghĩ rằng nó thực sự đi xuống đến những gì * BẠN * muốn ra khỏi giao diện của bạn và * CÁCH * bạn có kế hoạch sử dụng chúng hoặc làm thế nào chúng có liên quan với nhau. –

1

quote liên quan từ C# Đặc điểm kỹ thuật (phiên bản 5), phần 13,4:

Một lớp học hoặc struct đó trực tiếp thực hiện một giao diện cũng trực tiếp thực hiện tất cả các giao diện cơ bản của giao diện ngầm. Điều này đúng ngay cả khi lớp hoặc cấu trúc không liệt kê rõ ràng tất cả các giao diện cơ sở trong danh sách lớp cơ sở.

Vì vậy, không cần phải liệt kê rõ ràng các giao diện cơ sở. Tôi cho rằng nó chỉ được thực hiện để làm rõ cho nhà phát triển.

+0

@xandercoded Có cách nào tốt cho đa hình? – DavidG

+0

@xandercoded bạn nên hủy xóa một trong các câu trả lời của bạn và chỉnh sửa để giải thích ý của bạn. Phần bình luận của câu trả lời không liên quan không phải là nơi. – Blorgbeard

+0

Và bạn vẫn có vẻ thiếu điểm: không cần thiết phải khai báo rằng 'ICollection' thừa hưởng từ 'IEnumerable', vì nó thừa kế từ' IEnumerable ', kế thừa từ 'IEnumerable'. Vì vậy, cho dù bạn khai báo hay không, nó kế thừa từ 'IEnumerable'. Câu hỏi không phải là lý do tại sao nó nên làm điều đó, đó là về cú pháp cần thiết. – Blorgbeard

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