2010-07-11 15 views

risposta

17

Sì, non fa differenza in questo caso. In alcuni casi è possibile fare, se si utilizza una classe base che implementa già un'interfaccia ma si desidera reimplementarla esplicitamente - ma in questo caso non c'è una classe base (diversa dall'implicito object) e si sarebbe comportato esattamente allo stesso modo.

Contrariamente ai miei ricordi, non credo che ci sia una differenza nel modo in cui la classe viene rappresentata nei metadati, indipendentemente dal fatto che il codice dichiari esplicitamente tutte le interfacce o meno. Ecco un esempio:

interface IFoo {} 
interface IBar : IFoo {} 

class FooBar1 : IBar {} 
class FooBar2 : IBar, IFoo {} 

Sia ildasm e riflettore mostrano le stesse informazioni per FooBar1 e FooBar2 ... mostra entrambi applicazione IBar e IFoo.

In altre parole, non è possibile stabilire se il codice sorgente originale per List<T> specifica effettivamente tutte le interfacce o meno. Forse lo fa, forse no - ma non importa in entrambi i casi.

MODIFICA: per completezza, ho anche controllato i casi in cui si stanno estendendo due interfacce con un'altra interfaccia. In questo caso, non riesco a trovare una differenza nei metadati. Sono sicuro di ricordare alcune situazioni in cui era evidente, ma non riesco a trovarlo ora.

+0

Quindi, poiché non esiste una classe base. Non fa differenza. Allora perché gli sviluppatori hanno ereditato quelle due interfacce 'di nuovo'? –

+0

@Marco: vedere la mia risposta modificata. –

+0

Capito. Grazie mille. È stato veloce. –

5

Sì, lo farebbe. IList<T> stesso implementa gli altri due.

Il browser oggetto che si mostra tutte le interfacce gli attrezzi di classe, sia direttamente (IList<T>) o indirettamente (ICollection<T>, IEnumerable<T>, attraversoIList<T>).

+0

vuoi dire che è solo un trucco che il browser degli oggetti fa per semplificarci le cose? –

+0

Beh, se vuoi metterlo in questo modo. Penso davvero che sia perché il codice del browser elenca semplicemente tutte le interfacce implementate, senza preoccuparsi di filtrare quelle estese da altri. – Mau

3

Questo non è il modo in cui è stato effettivamente codificato dietro le quinte. È proprio quello che gli strumenti come Reflector ti mostrano quando trasforma l'IL in C#.

+0

Puoi vederlo anche nel visualizzatore di codice. – Incognito

+0

@Incognito: codeviewer lo genera dai metadati allo stesso modo di Reflector. – EFraim

Problemi correlati