Esta es una gran pregunta y una que he encontrado en mis proyectos.
Algunas personas sostienen que las interfaces y las clases abstractas existen solo para el polimorfismo, no para obligar a los tipos a implementar ciertos métodos. Personalmente, considero que el polimorfismo es un caso de uso primario, y la implementación forzada es secundaria. Utilizo la técnica de implementación forzada con bastante frecuencia. Por lo general, aparece en el código de marco que implementa un patrón de plantilla. La clase base/template encapsula algunas ideas complejas, y las subclases proporcionan numerosas variaciones al implementar los métodos abstractos. Un beneficio pragmático es que los métodos abstractos proporcionan orientación a otros desarrolladores que implementan las subclases. Visual Studio incluso tiene la capacidad de stub los métodos para usted. Esto es especialmente útil cuando un desarrollador de mantenimiento necesita agregar una nueva subclase meses o años después.
El inconveniente es que no hay soporte específico para algunos de estos escenarios de plantilla en C#. Los métodos estáticos son uno. Otro es constructores; idealmente, ISerializable debería obligar al desarrollador a implementar el constructor de serialización protegido.
El enfoque más sencillo probablemente sea (como se sugirió anteriormente) utilizar una prueba automática para verificar que el método estático se implemente en los tipos deseados. Otra idea viable ya mencionada es implementar una regla de análisis estático.
Una tercera opción es utilizar un marco de Programación Orientada a Aspectos como PostSharp. PostSharp admite la validación de aspectos en tiempo de compilación. Puede escribir código .NET que refleje sobre el conjunto en tiempo de compilación, generando advertencias y errores arbitrarios. Por lo general, haces esto para validar que el uso de un aspecto es apropiado, pero no veo por qué no podrías usarlo también para validar reglas de plantilla.
Perdón por mi curiosidad, pero no puedo evitar preguntarme ¿por qué necesitarías una función como esta? ¿Qué métodos estáticos tienen los métodos de instancias ordinarias (no estáticos) que no tienen? Nada viene a mi mente. ¿Quieres compartir un contexto para tu pregunta? – Dan
No necesita una instancia para llamar a un método estático. Entonces son agradables de usar como métodos de fábrica, por ejemplo, un método de deserialización. – tpower
@Dan: un uso adicional sería la capacidad de usar la interfaz sin saber si está trabajando en una instancia o un tipo (o cambiar eso más adelante). Piense en una clase estática que represente algún tipo de lista singleton, y que debería, como una lista adecuada, implementar 'IList'. Claro, la solución alternativa de almacenar una instancia de una clase que implemente 'IList ' en la clase estática es factible (y soy consciente de que C# actualmente por ahora solo lo permite), pero la capacidad de declarar directamente una clase como estática la implementación de una interfaz eliminaría un nivel innecesario de indirección. –