2009-12-15 12 views
17

Tutto quello che voglio fare è assicurarsi che classi figlie della classe Item implementare un metodo staticoe voglio questo da controllare al momento della compilazione per evitare errori di runtime.Come posso forzare l'ereditazione delle classi per implementare un metodo statico in C#?

classi astratte con metodi statici non sembrano funzionare:

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(); 
    } 
} 

e interfacce non sembra funzionare sia:

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(); 
} 

C'è un po ' rkaround per fare in modo che il compilatore verifichi se l'ereditarietà delle classi implementa un metodo statico con una certa firma o no?

risposta

0

Per definizione non è possibile implementare un metodo statico nelle classi derivate.

3

Non ha senso forzare i clienti a implementare un metodo statico - metodi statici sono "immutabili". (Probabilmente c'è un modo migliore per descriverli, ma è tutto quello che mi viene in mente adesso!)

Se è necessario eseguire una sorta di sovrascrittura, prenderei in considerazione la possibilità di rivedere il disegno, magari usando una qualche forma di combinazione di singleton e di iniezione.

+0

Ho un elemento di classe che eredita vari oggetti, ad es. Cliente, Indirizzo, ecc. E se una classe è di tipo Item, allora voglio essere in grado di chiamare un metodo factory chiamato GetHistoricalItem(). Quindi voglio essere in grado di dire indirizzo Address = Address.GetHistoricalItem (...). E voglio sapere al momento della compilazione che tutte le mie classi che ereditano Item lo fanno. Dovrebbe funzionare come i metodi per esempio. –

+0

@EdwardTanguay questo è da molto tempo fa, ma è meglio creare qualche tipo di classe History (istanza) che contenga metodi normali per il recupero degli indirizzi. Il registro sarebbe un buon nome, per esempio. –

19

C'è una soluzione ho capito per lo scenario:

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(); 
    } 
} 

Spero che questo aiuti !!

+0

+1 Questo è il modo per risolvere il problema dell'OP. – Groo

+2

Non sta producendo alcun errore anche quando Cliente/Indirizzo non sta implementando la funzione GetHistoricItem. Mi sto perdendo qualcosa? – Bill

+0

@ Yongke Bill Yu: perché pensi che dovrebbe? – jwaliszko

Problemi correlati