2009-12-15 9 views
17

Todo lo que quiero hacer es asegurarse de que las clases de los niños de la clase de artículo implementar un método estáticoy yo quiero que esto se puede comprobar en tiempo de compilación para evitar los errores de ejecución.¿Cómo puedo forzar que las clases heredadas implementen un método estático en C#?

no parecen

clases abstractas con métodos estáticos para trabajar:

ERROR: A static member cannot be marked as override, virtual, or abstract

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 no parecen interfaces para trabajar ya sea:

ERROR: Customer does not implement interface member 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 algún wo ¿Para qué sirve verificar al compilador si las clases heredadas implementan un método estático con una determinada firma o no?

Respuesta

0

Por definición, no se puede implementar un método estático en las clases derivadas.

3

No tiene sentido obligar a los clientes a implementar un método estático - métodos estáticos son "inmutables". (¡Probablemente haya una mejor manera de describirlos, pero eso es todo lo que se me ocurre ahora mismo!)

Si se requiere algún tipo de anulación, consideraría volver a visitar el diseño, posiblemente usando algún tipo de combinación de singletons e inyección.

+0

Tengo un elemento de clase que varios objetos heredan, p. Cliente, dirección, etc. Y si una clase es de tipo Item, entonces quiero poder llamar a un método de fábrica llamado GetHistoricalItem(). Así que quiero poder decir Address address = Address.GetHistoricalItem (...). Y quiero saber en tiempo de compilación que todas mis clases que heredan Item hacen esto. Simplemente debería funcionar de la misma manera que lo hace, por ejemplo, los métodos. –

+0

@EdwardTanguay Esto es de hace mucho tiempo, pero es mejor crear algún tipo de clase de historial (instancia) que contenga métodos normales para recuperar direcciones. Registrarse sería un buen nombre, por ejemplo. –

19

Hay una solución que me di cuenta 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 !!

+0

+1 Esa es la manera de resolver el problema de OP. – Groo

+2

No produce ningún error incluso cuando el Cliente/Dirección no implementa la función GetHistoricItem. ¿Me estoy perdiendo de algo? – Bill

+0

@Yongke Bill Yu: ¿por qué crees que debería? – jwaliszko

Cuestiones relacionadas