C# Abstrakte Funktion, mit der Umsetzung möglich?
Gibt es eine Möglichkeit hinzufügen, um eine virtuelle Funktion, die überschrieben werden müssen, die von allen Klassen geerbt? Also eigentlich die Kombination von virtual und abstract?
Ich habe eine situation, wo jeder geerbten Klasse müssen einige spezifische Verarbeitung vor einige generische code ausgeführt wird. Virtuelle Funktionen nicht arbeiten, weil Sie nicht gewährleisten das geerbte Klassen diese überschreiben. Und abstrakte Funktion kann nicht über eine Standard-Implementierung. Aktuell mein workaround ist die Umsetzung eine andere geschützte Funktion in der Basis-Klasse, die enthält die Allgemeinen/generischen code und heißt in der überschriebenen abstrakten Funktion
- Wenn es eine default-Implementierung, warum soll es überschrieben werden? Nicht, dass die Niederlage der Zweck? Warum nicht einfach machen es Abstrakt, wenn es immer geht, um sowieso überschrieben?
- Wenn Sie die Funktion überschreiben, können einfach ändern Sie den Körper. Sie können nicht ändern Sie die Signatur der Methode.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es nicht möglich, eine Methode ist Abstrakt und virtuell.
Wenn möglich, können Sie teilen Sie Ihre Methode in ein "vorher" und "nachher" - Teil:
Ansonsten ist dein workaround mit einer zweiten geschützten Methode ist eine sehr gute Idee:
Können Sie überprüfen, ob DoCommonWork war wirklich genannt in DoWork mit einer thread-lokalen Feld, wenn nötig.
Allerdings würde ich wahrscheinlich gehen, mit der Methode der virtuellen. Wenn die abgeleitete Klasse nicht wollen, fügen nichts zu den gemeinsamen Teil, so sollte es nicht:
Wieder, können Sie prüfen, ob der Allgemeine Teil war wirklich genannt.
Ich denke, Sie könnten auf der Suche nach einem template-Methode: Implementieren Sie eine Methode in der Basisklasse eine abstrakte Methode aufgerufen, die als Teil der Implementierung. Abgeleitete Klassen dann implementieren die abstrakte Methode, aber dadurch wird die Basis-Klasse zu tun "einige spezifische Verarbeitung", bevor diese Methode ausgeführt wird.
Mein Vorschlag zur Aufteilung der Basis-Klasse in zwei: Klassen, die eine abstrakte und eine konkrete versiegelt.
Beispiel
Ich nehme an, Sie haben Basis-Klasse, die so aussieht:
Lassen Sie uns es geteilt auf zwei:
Mit diesem design, wenn Sie brauchen, um zu implementieren neue Verarbeitungslogik, Sie Erben die neue Klasse von der
BaseClass
und weil es Abstrakt ist, müssen Sie implementieren dieDoSomethigImplementation
Methode. Zum Zugriff auf die Standard-Prozess-Logik, die Sie verwenden sollten eine Instanz derDefaultBaseClassImplementation
Klasse. Und dass dieDefaultBaseClassImplementation
verschlossen ist, wird nicht zulassen, Sie Erben von der falschen Klasse.