Ecco una versione semplificata della mia classe:Una classe base può determinare se una classe derivata ha sovrascritto un membro virtuale?
public abstract class Task
{
private static object LockObject = new object();
protected virtual void UpdateSharedData() { }
protected virtual void UpdateNonSharedData() { }
public void Method()
{
lock(LockObject)
{
UpdateSharedData();
}
UpdateNonSharedData();
}
}
sto cercando di nascondere il codice di blocco da classi derivate. Ma voglio solo ottenere il blocco se la classe derivata sovrascrive UpdateSharedData; in caso contrario, non voglio che il metodo blocchi e attenda su tutte le altre istanze in esecuzione che aggiornano i dati condivisi prima di aggiornare i dati non condivisi.
Quindi la cosa (apparentemente) ovvia per il Metodo da fare è controllare e vedere se l'implementazione dell'istanza corrente di UpdateSharedData ha superato l'implementazione della classe base. Sono abbastanza sicuro che questo non è possibile senza l'uso del riflesso, e probabilmente non è desiderabile farlo.
ho pensato di alcune soluzioni a questo, ma sono tutti piuttosto imbarazzante:
- aggiungere una proprietà bool protetta che i set di costruzione della classe derivata, e verificare che la proprietà per vedere se un blocco è necessario. Questo sta facendo un terribile compito di nascondere il codice di blocco dalle classi derivate.
- Rendi il metodo UpdateSharedData una proprietà delegata, imposta una classe derivata la proprietà a un metodo privato nel suo costruttore e ottieni il blocco solo se il delegato non è nullo. È meglio, ma è ancora un po 'schifoso.
Ho appena realizzato che IHasSharedData assomiglia molto al codice LOLCats. :-) ICanHazSharedData? – tvanfosson
Questa è stata la prima cosa che ho notato anche io! Sarà molto difficile per me resistere nel dargli un nome del genere. Questa è esattamente la risposta che stavo cercando comunque. –