Re-implementação de uma interface que outra interface já herda
-
05-07-2019 - |
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.
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() {}
}
}