Hier ist eine vereinfachte Version meiner Klasse:
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 vor abgeleiteten Klassen zu verbergen. Ich möchte jedoch nur das Schloss erhalten, wenn die abgeleitete Klasse UpdateSharedData außer Kraft setzt; Wenn es das nicht tut, möchte ich nicht, dass die Methode blockiert und auf alle anderen laufenden Instanzen wartet, die gemeinsame Daten aktualisieren, bevor sie die nicht gemeinsamen Daten aktualisiert.
Also das (scheinbar) offensichtliche, das Methode tun sollte, ist zu überprüfen und zu sehen, ob die Implementierung von UpdateSharedData der aktuellen Instanz die Implementierung der Basisklasse überschrieben hat. Ich bin mir ziemlich sicher, dass dies ohne Verwendung von Reflexion nicht möglich ist, und es ist wahrscheinlich nicht wünschenswert, das zu tun.
Ich habe mir einige Workarounds dazu überlegt, aber sie sind alle ziemlich umständlich:
- Fügen Sie eine geschützte boolsche Eigenschaft hinzu, die der Konstruktor der abgeleiteten Klasse festlegt, und überprüfen Sie diese Eigenschaft, um zu sehen, ob ein Schloss erforderlich ist. Das Verbergen des Sperrcodes vor den abgeleiteten Klassen ist keine besonders gute Idee.
- Machen Sie die UpdateSharedData-Methode zu einer Delegat-Eigenschaft, lassen Sie jede abgeleitete Klasse die Eigenschaft auf eine private Methode in ihrem Konstruktor setzen, und erhalten Sie das Sperreigenschaft, wenn der Delegat nicht null ist. Das ist besser, aber es ist immer noch ziemlich ärgerlich.