Pregunta

pregunta similar pero no exactamente lo mismo

Estaba pensando que con los métodos de extensión en el mismo espacio de nombres como la interfaz que usted podría conseguir un efecto similar a la herencia múltiple en el que no deben tener el código duplicado la aplicación de la misma interfaz de la misma manera en 10 clases diferentes.

¿Cuáles son algunas de las desventajas de hacer esto? Creo que las ventajas son bastante obvias, son los contras que vienen generalmente volver a morder más adelante.

Una de las desventajas que veo es que los métodos de extensión no pueden ser virtuales, por lo que necesita para asegurarse de que realmente no quiere que implementan la misma manera para todos los casos.

No hay solución correcta

Otros consejos

El problema que veo con capacidad de interfaz edificio a través de los métodos de extensión es que usted está en realidad ya no implementa la interfaz y por lo tanto no se puede utilizar el objeto como el tipo de interfaz.

Decir que tengo un método que toma un objeto de tipo IBar. Si implementan la interfaz IBar en Foo clase a través de métodos de extensión, entonces Foo no derivan de Ibar y no se puede utilizar de forma intercambiable con él (Liskov principio de sustitución). Claro, yo entiendo el comportamiento que desea añadir a Foo, pero pierdo el aspecto más importante de la creación de interfaces en el primer lugar - ser capaz de definir un contrato abstracta que puede ser implementado en una variedad de maneras por diferentes clases para que clases dependientes no necesitan saber acerca de las implementaciones concretas.

Si necesitaba la herencia múltiple (y hasta ahora he vivido sin ella) lo suficiente, creo que haría uso de la composición en vez de reducir al mínimo la cantidad de duplicación de código.

Una buena manera de pensar acerca de esto es que los métodos de instancia son algo que se hace por del objeto, mientras que los métodos de extensión se hacen algo a el objeto. Estoy bastante seguro de las Directrices de diseño de la estructura decir que usted debe poner en práctica un método de instancia siempre que sea posible.

Una interfaz declara "me importa acerca del uso de esta funcionalidad, pero no la forma en que se lleva a cabo." Eso deja a los ejecutores de la libertad de elegir la forma. Se desacopla la intención, una API pública, del mecanismo, una clase con código de hormigón.

Como esta es la principal ventaja de las interfaces, la implementación de todo, ya que los métodos de extensión parece frustrar su propósito. Incluso IEnumerable<T> tiene un método de instancia.

Editar : Asimismo, los objetos están destinados a actuar sobre los datos que contienen. Los métodos de extensión sólo pueden ver API pública de un objeto (ya que son sólo métodos estáticos); que tendría que exponer todos estado de un objeto para hacerlo funcionar (un OO no-no).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top