2008-11-01 43 views
6

tôi nhìn thấy những thứ như thế này rất nhiều:lại thực hiện một giao diện mà giao diện khác đã được thừa hưởng

interface A { ... } 
interface B : A { ... } 
class C : B, A { ...} 

Tại sao bạn sẽ xác định rằng C thực hiện giao diện A, B khi đã thừa hưởng A? Nó có tạo nên sự khác biệt ngữ nghĩa hay chỉ là vấn đề về phong cách?

(Một trong nhiều ví dụ là List<T> thực hiện IList<T>ICollection<T>, trong khi IList<T> cũng xuất phát từ ICollection<T>).


Cập nhật: Cảm ơn bạn đã xác nhận tôi đoán rằng nó không thực hiện bất kỳ sự khác biệt ngữ nghĩa.

tôi đã đưa ra một tình huống liên quan đến nơi nó không tạo sự khác biệt để đặt tên một cách rõ ràng một giao diện đó là đã có trong cây thừa kế:

Nếu B là một lớp học, C sẽ chỉ (lại) triển khai các thành viên giao diện từ A nếu tên đó là A một cách rõ ràng sau ':'.

[EDIT] Tôi đã thay đổi từ ngữ của câu hỏi để tránh nhầm lẫn với các thành viên giao diện được triển khai rõ ràng, hạn chế việc sử dụng thành viên đối với trường hợp đối tượng được truyền làm giao diện.

Trả lời

11

Tôi tin rằng đây chỉ là vấn đề về phong cách. Điều này đặc biệt quan trọng khi xem xét các lớp khung/thư viện - ví dụ, nó làm nổi bật ý tưởng rằng lớp này có thể được coi là ICollection hoặc IList, không có nhà phát triển phải biết rằng IList thực sự là một ICollection.

Nó không có phân nhánh chức năng. Cụ thể, mã này sẽ biên dịch hay không lớp 'C' cụ 'A' một cách rõ ràng:

namespace DotNetInterfaceTest { 
    class Program { 
     static void Main(string[] args) { 
      A c = new C(); 
     } 
    } 

    interface A { 
     void foo(); 
    } 

    interface B : A { 
     void bar(); 
    } 

    class C : B { 
     public void bar() {} 
     public void foo() {} 
    } 
} 
+0

Tôi nghĩ đó là để có thể đọc tốt hơn .. mà không cần phải làm việc các tế bào não của bạn đi qua hệ thống phân cấp giao diện thừa kế. – Gishu

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