Domanda

Vedo molto cose del genere:

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

Perché dovresti specificare che C implementa l'interfaccia A, quando B eredita già A? Fa qualche differenza semantica o è solo una questione di stile?

(Uno dei tanti esempi è List<T> implementando IList<T> e ICollection<T>, mentre B deriva anche da C).


Aggiornamento: Grazie per aver confermato la mia ipotesi che non faccia alcuna differenza semantica.

Ho trovato una situazione correlata in cui non fa la differenza nel nominare esplicitamente un'interfaccia che è già nella struttura ereditaria:

Se A fosse una classe, : implementerebbe (ri) i membri dell'interfaccia da <=> solo se nominasse <=> in modo esplicito dopo "<=>".

[EDIT] Ho modificato il testo della domanda per evitare confusione con i membri dell'interfaccia esplicitamente implementati, che limitano l'uso del membro ai casi in cui l'oggetto viene trasmesso come interfaccia.

È stato utile?

Soluzione

Credo che sia solo una questione di stile. È particolarmente importante quando si esaminano le classi framework / library - nel tuo esempio, ad esempio, evidenzia l'idea che questa classe può essere trattata come ICollection o IList, senza che lo sviluppatore debba sapere che IList è in realtà un ICollection.

Non ha ramificazioni funzionali. In particolare, questo codice verrebbe compilato o meno la classe "C" implementa esplicitamente "A":

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() {}
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top