2015-03-20 16 views
5

Warum IList wie folgt definiert ist?Warum IList <T> implementieren IEnumerable <T> und ICollection <T> während ICollection <T> selbst IEnumerable implementiert <T>

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

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

public interface IEnumerable<T> : IEnumerable 

Könnte es nicht sein, nur

public interface IList<T> : ICollection<T> 

So zu testen ich diese Schnittstellen geschaffen, nur um sicher zu sein, ob das funktioniert!

public interface IOne 
{ 
    string One(); 
} 

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

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

Während seiner völlig in Ordnung, klagt ReSharper über "Redundante Schnittstellen".

Irgendwelche Ideen, warum Microsoft mit dieser Implementierung fortfuhr?

+1

Wo haben Sie die Duplizierung gesehen? (Was ist Ihre Quelle für die Quelle von 'IList ', so zu sprechen?) –

+0

@JonSkeet: Nur gedrückt 'F12' /' Go to Definition' auf der 'IList '. Es zeigte mir die "Methodensignatur" aus den 'Assembly-Metadaten'. Ich habe es von dort aus gesehen. –

+1

Nebenbei ist es hilfreich, nur Backticks für Dinge zu verwenden, die wirklich Code sind. (Ich habe die zusätzlichen Bits von Ihrem Beitrag bearbeitet) –

Antwort

9

Schnittstelle "Vererbung" ist einer der irreführendsten Begriffe in der Softwareentwicklung. Du hast Squat nicht erbt, Interfaces haben keine Implementierung, du kannst sie also auch nicht erben. Sie erben nur die Anforderung, um die Methoden zu implementieren.

Wenn Sie diese Anforderung durch Wiederholen der Schnittstellendeklaration hinzufügen, ändert sich nichts, Sie hatten bereits die Nachfrage und das Hinzufügen einer zusätzlichen Nachfrage macht überhaupt keinen Unterschied. Da es also keine Rolle spielt, wiederholt Microsoft die Schnittstelle einfach, sodass Sie auf einen Blick erkennen können, welche Schnittstellen beispielsweise von List implementiert sind. Sie müssen nicht auf die Schnittstellendeklaration zugreifen, um zu sehen, dass List auch IEnumerable implementiert. Es ist ein selbstdokumentierender Codierungsstil, der empfohlen wird.

Hüten Sie sich vor der anderen Seite dieser Medaille, zwei verschiedene Schnittstellen mit der exakt gleichen Methode kann mit nur einer einzigen Methodenimplementierung implementiert werden. Während das oft nützlich ist, ist das manchmal nicht das was du willst. Sag, ICowboy und IPainter, beide haben eine Draw() -Methode. Es sollte nicht dasselbe tun :) Sie müssen dann auf eine explizite Implementierung zurückgreifen, um die Mehrdeutigkeit zu vermeiden.

Adressierung der Resharper Beschwerde, ist es natürlich nicht sehr hilfreich. Resharper neigt dazu, von einem Programmierer das Schlimmste anzunehmen. Aber wenn Sie es beenden möchten, müssen Sie IOne aus der IThree Vererbungsliste entfernen, es ist redundant. Das gleiche gilt für die Klasse, die IThree implementiert, Sie müssten ITwo und IOne auch aus der Vererbungsliste entfernen. Oder schalten Sie einfach die Warnung aus.

+2

good point => empfehle selbst dokumentieren Stil. –

+1

Danke @Hans.Außerdem erklärt 'Eric Lippert' das wunderschön hier: http://blogs.msdn.com/b/ericlippert/archive/2011/04/04/so-viele-interfaces.aspx # comments' –