polimorfismo - ¿Cómo puedo obligar a las clases heredadas a implementar un método estático en C#?
instanciar una clase c# (5)
Hay una solución que descubrí para su escenario:
public class Customer : Reference<Customer>, IHistoricalItem
{
}
public class Address : Reference<Address>, IHistoricalItem
{
}
public interface IHistoricalItem
{
}
public class Reference<T> where T : IHistoricalItem, new()
{
public static T GetHistoricItem(int id, DateTime pastDateTime)
{
return new T();
}
}
¡¡Espero que esto ayude!!
Todo lo que quiero hacer es asegurarme de que las clases secundarias de la clase Item implementen un método estático y quiero que esto se compruebe en tiempo de compilación para evitar errores de tiempo de ejecución.
las clases abstractas con métodos estáticos no parecen funcionar:
ERROR: un miembro estático no se puede marcar como anulación, virtual o abstracto
public abstract class Item
{
public static abstract Item GetHistoricalItem(int id, DateTime pastDateTime);
}
public class Customer : Item
{
public static override Customer GetHistoricalItem(int id, DateTime pastDateTime)
{
return new Customer();
}
}
public class Address : Item
{
public static override Address GetHistoricalItem(int id, DateTime pastDateTime)
{
return new Address();
}
}
y las interfaces tampoco parecen funcionar:
ERROR: el cliente no implementa el miembro de interfaz GetHistoricalItem ()
public class Customer : Item, HistoricalItem
{
public static Customer GetHistoricalItem(int id, DateTime pastDateTime)
{
return new Customer();
}
}
public class Address : Item, HistoricalItem
{
public static Address GetHistoricalItem(int id, DateTime pastDateTime)
{
return new Address();
}
}
interface HistoricalItem
{
Item GetHistoricalItem();
}
¿Hay alguna solución alternativa para que el compilador compruebe si las clases heredadas implementan un método estático con una determinada firma o no?
Por definición, un método estático no puede implementarse en clases derivadas.
No tiene sentido obligar a los clientes a implementar un método estático: los métodos estáticos son "inmutables". (¡Probablemente haya una mejor manera de describirlos, pero eso es todo lo que puedo pensar en este momento!)
Si se requiere algún tipo de sobreescritura, consideraría volver a visitar el diseño, posiblemente usando alguna forma de combinación de singleton e inyección.
Esto no puede hacerse.
Eche un vistazo a ¿Por qué no puedo tener métodos estáticos abstractos en c #?
Parece que no es posible, eche un vistazo: ¿Hay alguna manera de forzar una clase C # para implementar ciertas funciones estáticas?