Entiendo que la herencia de métodos estáticos no es compatible con C#. También he leído varias discusiones (incluso aquí) en las que los desarrolladores afirman que es necesario contar con esta funcionalidad, a lo que la respuesta típica es "si necesita herencia de miembros estáticos, hay un defecto en su diseño".¿Cuál es la alternativa correcta a la herencia de métodos estáticos?
OK, dado que OOP no quiere que siquiera piense en la herencia estática, debo concluir que mi aparente necesidad apunta a un error en mi diseño. Pero, estoy atascado. Realmente apreciaría algo de ayuda para resolver esto. Aquí está el desafío ...
Quiero crear una clase base abstracta (llamémosle Fruit) que encapsula un código complejo de inicialización. Este código no se puede colocar en el constructor, ya que parte de él se basará en llamadas a métodos virtuales.
La fruta será heredada por otras clases concretas (Apple, Orange), cada una de las cuales debe exponer un método de fábrica estándar CreateInstance() para crear e inicializar una instancia.
Si la herencia de miembros estáticos fuera factible, colocaría el método de fábrica en la clase base y usaría una llamada de método virtual a la clase derivada para obtener el tipo desde el cual se debe inicializar una instancia concreta. El código del cliente invocaría simplemente a Apple.CreateInstance() para obtener una instancia de Apple totalmente inicializada.
Pero claramente esto no es posible, por lo que alguien puede explicar cómo mi diseño debe cambiar para adaptarse a la misma funcionalidad.
Me gustaría señalar que la frase "Este código no se puede colocar en el constructor, ya que parte de ella se basará en llamadas a métodos virtuales" no es correcta. PUEDE llamar a métodos virtuales dentro de un constructor. (Tendrá que diseñar sus llamadas cuidadosamente, porque puede tener una clase parcialmente inicializada cuando se llaman los métodos virtuales, pero es compatible). Consulte la respuesta de Ravadre para obtener más detalles. – Ruben