Similar question but not quite the same thingPseudo-herencia múltiple con métodos de extensión en interfaces en C#?
Estaba pensando que con los métodos de extensión en el mismo espacio de nombres que la interfaz se puede 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 que en el 10 diferentes clases
¿Cuáles son algunos de los inconvenientes de hacer esto? Creo que los pros son bastante obvios, son los contras los que generalmente vuelven a morderte más adelante.
Uno de los inconvenientes 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.
¿Podría explicar "entonces Foo no se deriva de IBar y no se puede usar indistintamente con él"? Si tengo clase pública Foo: IBar, ¿no podría pasar en un Foo en cualquier lugar y se espera un IBar? ¿O quisiste decir algo diferente? Me doy cuenta de que deja de funcionar como una interfaz. Funcionalmente, lo visualizo actuando más como una clase base concreta sin métodos virtuales que una interfaz.(Si es una buena idea o no, posiblemente sea una pregunta aparte, pero parece útil mantener DRY) – Davy8
Y la mayoría de las veces no veo demasiada necesidad de herencia múltiple, pero hay una parte del código en funcionamiento que parece un desastre con el código repetido implementando la misma interfaz en literalmente 10-20 clases diferentes con el mismo código, y no se pudo poner en una clase base porque ya derivan de otra clase base que tiene métodos común a una interfaz diferente. – Davy8
Si Foo se deriva de IBar, entonces necesita tener métodos de instancia, no métodos de extensión que implementen IBar. ¿Esperas delegar estos métodos en los métodos de extensión? Asumí que la implementación fue proporcionada únicamente por las extensiones. Si está haciendo delegación, entonces creo que la composición de las clases base que implementan la funcionalidad de interfaz deseada es más preferible que los métodos de extensión. Tal vez podría proporcionar la funcionalidad utilizando el patrón de decorador. – tvanfosson