Pergunta

pergunta homóloga mas não é bem a mesma coisa

Eu estava pensando que, com métodos de extensão no mesmo namespace como a interface você pode obter um efeito semelhante a herança múltipla em que você não precisa ter código duplicado implementar a mesma interface da mesma forma em 10 classes diferentes.

Quais são algumas das desvantagens de se fazer isso? Acho que os prós são bastante óbvias, é os contras que geralmente vêm de volta a morder-lhe mais tarde.

Um dos contras eu vejo é que os métodos de extensão não pode ser virtual, então você precisa ter certeza de que você realmente quer que eles implementada da mesma forma para todos os casos.

Nenhuma solução correta

Outras dicas

O problema que eu vejo com a construção de capacidade de interface através de métodos de extensão é que você não está mais realmente implementar a interface e, portanto, não pode usar o objeto como o tipo de interface.

dizer que tenho um método que leva um objeto do tipo IBar. Se eu implementar a interface IBar na classe Foo via métodos de extensão, em seguida, Foo não deriva de IBar e não podem ser usados ??alternadamente com ele (substituição de Liskov). Claro, eu obter o comportamento que eu quero adicionado ao Foo, mas eu perder o aspecto mais importante de criação de interfaces em primeiro lugar - ser capaz de definir um contrato abstrato que pode ser implementado em uma variedade de maneiras por várias classes de modo que classes dependentes não precisam saber sobre implementações concretas.

Se eu precisasse de herança múltipla (e até agora eu vivi sem ele) mal o suficiente, eu acho que eu usaria composição em vez de minimizar a quantidade de duplicação de código.

Uma maneira decente para pensar sobre isso é que os métodos de instância são algo feito por o objeto, enquanto que os métodos de extensão são algo feito para o objeto. Estou bastante certo das Diretrizes de Design Framework dizem que você deve implementar um método de instância sempre que possível.

Uma interface declara "Eu me preocupo sobre como utilizar esta funcionalidade, mas não como ele é feito." Isso deixa implementadores a liberdade de escolher o como. Ele separa a intenção, uma API pública, a partir do mecanismo, uma classe com código de concreto.

Como este é o principal benefício de interfaces, implementá-las inteiramente como métodos de extensão parece derrotar o seu propósito. Mesmo IEnumerable<T> tem um método de instância.

Editar : Além disso, os objetos são feitos para agir sobre os dados que eles contêm. Os métodos de extensão só pode ver API pública de um objeto (como eles são apenas métodos estáticos); você teria que expor todas do estado de um objeto para fazê-lo funcionar (um OO não-não).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top