2008-11-01 10 views
6

widzę rzeczy tak dużo:Re-wykonawczych interfejsu, który już inny interfejs dziedziczy

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

Dlaczego chcesz określić, że C implementuje interfejs, gdy B już dziedziczy? Czy ma to jakieś znaczenie semantyczne, czy jest to tylko kwestia stylu?

(jeden z przykładów realizacji jest List<T>IList<T> i ICollection<T>, a IList<T> wynika również z ICollection<T>).


Aktualizacja: Dzięki za potwierdzające moje przypuszczenie, że nie ma żadnej różnicy semantycznej.

mam wymyślić związanego sytuacji, w której ma coś zmienić, aby wyraźnie wymienić interfejs, który jest już w drzewie dziedziczenia:

Jeśli B były klasy, C będzie tylko (re-) implementuj elementy interfejsu od A, jeśli nazwa A jest jawnie umieszczana po ":".

[EDYCJA] Zmieniłem sformułowanie pytania, aby uniknąć pomyłki z jawnie zaimplementowanymi elementami interfejsu, które ograniczają korzystanie z elementu do przypadków, w których obiekt jest rzutowany jako interfejs.

Odpowiedz

11

Uważam, że to tylko kwestia stylu. Jest to szczególnie ważne przy przeglądaniu klas framework/library - w twoim przykładzie, na przykład, podkreśla ideę, że ta klasa może być traktowana jako ICollection lub IList, bez dewelopera, który musi wiedzieć, że IList jest faktycznie ICollection.

Nie ma żadnych konsekwencji funkcjonalnych. Konkretnie, to kod będzie kompilować czy klasę „C” implementuje „a” in extenso:

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

Myślę, że to dla lepszej czytelności .. bez konieczności pracy swoich komórek mózgowych przechodzących przez interfejs hierarchii dziedziczenia. – Gishu