Pergunta

Eu vejo coisas como esta muito:

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

Por que você especifique que implementa C de interface A, quando B já herda uma? Faz alguma diferença semântica ou é apenas uma questão de estilo?

(Um dos muitos exemplos é List<T> implementação IList<T> e ICollection<T>, enquanto IList<T> também deriva ICollection<T>).


Update:. Obrigado por confirmar meu palpite que não faz qualquer diferença semântica

Eu tenho chegar a uma situação relacionada onde faz fazer a diferença para citar explicitamente uma interface que já está na árvore de herança:

Se B eram uma classe, C seria somente (re) implementar a interface membros de A se nomeia A explicitamente após o ':'.

[EDIT] Eu mudei a formulação da questão à confusão evitar com membros de interface explicitamente implementados, que restringem o uso do membro aos casos em que o objeto é escolhida como a interface.

Foi útil?

Solução

Eu acredito que esta é apenas uma questão de estilo. Ele é especialmente importante quando se olha para framework / biblioteca de classes - no seu exemplo, por exemplo, ele destaca a ideia de que esta classe pode ser tratado como qualquer um ICollection ou um IList, sem o desenvolvedor ter que saber que IList é realmente um ICollection.

Ele não tem ramificações funcionais. Especificamente, este código seria compilar ou não classe 'C' implementos 'A' explicitamente:

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() {}
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top