Hier ist eine vereinfachte Version meiner Klasse:Kann eine Basisklasse feststellen, ob eine abgeleitete Klasse ein virtuelles Mitglied überschrieben hat?
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();
}
}
Ich versuche, den Sperrcode von abgeleiteten Klassen zu verstecken. Aber ich möchte nur die Sperre erhalten, wenn die abgeleitete Klasse UpdateSharedData überschreibt; Wenn dies nicht der Fall ist, möchte ich nicht, dass die Methode alle anderen ausgeführten Instanzen blockiert und wartet, die freigegebene Daten aktualisieren, bevor sie die nicht freigegebenen Daten aktualisieren.
Die (scheinbar) naheliegende Sache, die Method zu tun hat, besteht darin, zu überprüfen, ob die Implementierung von UpdateSharedData durch die aktuelle Instanz die Implementierung der Basisklasse überschrieben hat. Ich bin mir ziemlich sicher, dass dies ohne Reflektion nicht möglich ist, und es ist wahrscheinlich nicht wünschenswert, das zu tun.
Ich habe gedacht, einige Abhilfen zu dieser, aber sie sind alle ziemlich umständlich:
- eine geschützte Bool Eigenschaft hinzufügen, dass die Konstruktor-Sets der abgeleiteten Klasse, und prüfen Sie diese Eigenschaft, um zu sehen, ob eine Sperre erforderlich. Das macht eine ziemlich schreckliche Aufgabe, den Sperrcode vor den abgeleiteten Klassen zu verbergen.
- Machen Sie die UpdateSharedData-Methode zu einer Delegateigenschaft, lassen Sie eine abgeleitete Klasse die Eigenschaft für eine private Methode in ihrem Konstruktor festlegen und erhalten Sie nur die Sperre, wenn der Delegat nicht null ist. Das ist besser, aber es ist immer noch irgendwie scheiße.
Ich habe gerade festgestellt, dass IHasSharedData dem LOLCats-Code sehr ähnlich sieht. :-) ICanHazSharedData? – tvanfosson
Das war das erste, was mir auch aufgefallen ist! Es wird sehr schwer für mich sein, einem solchen Namen zu widerstehen. Das ist genau die Antwort, nach der ich gesucht habe. –