Virtuelle Methoden ohne Körper
War ich bei der Suche etwas Quellcode in eine abstrakte Klasse:
public virtual void CountX(){}
public virtual void DoCalculation() { ...code}
Warum sollte ich erklären, eine leere virtuelle Methode in einer abstrakten Klasse, wenn es ist nicht obligatorisch, um es zu überschreiben in abgeleiteten Typen?
- virtueller. yeah 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als @Adam hat Sie gesagt, es gibt viele Fälle, in denen es Sinn macht. Wenn Sie erstellen eine abstrakte Klasse, es ist, weil Sie wollen, erstellen Sie eine gemeinsame Schnittstelle für alle abgeleiteten Klassen aus, die eine; aber auf dieser Ebene der Vererbung, Sie haben nicht genug Informationen, um in der Lage zu schaffen funktionierenden code für diese Methode.
Zum Beispiel, wenn Sie erstellen die Klasse Abbildung, mit der getArea() Methode, Sie werden nicht in der Lage, code zu schreiben, die gehen, um korrekt zu berechnen, den Bereich für alle Figuren. Du wirst warten müssen, schreiben Sie den code für Rechteck, oder Kreis (sowohl der Ableitung von Abbildung), um schreiben zu können, arbeiten code für Sie.
virtual
da Sie möchten, dass alle abgeleiteten Formen, um Ihre Flächen berechnen. Dieses Verhalten sollte nicht optional ist und weggelassen werden.Weil, wenn das default-Verhalten ist, nichts zu tun, aber abgeleitete Klassen könnte etwas tun wollen. Es ist eine perfekt gültige Struktur.
Ermöglicht es dem base-code zu nennen. Sie neigen dazu, ähnliche Entwürfe, wenn es "BeforeXXX" und "AfterXXX" - code, der an der Basis-Klasse dieser code ist leer, aber die Methode braucht, um es zu kompilieren. In abgeleiteten Klassen, dieser code ist optional, muss aber, um sein virtuelles außer Kraft gesetzt werden.
Die Tatsache, dass es in eine abstrakte Klasse sollte nicht zu verwechseln sein Verhalten.
Beispiel:
Wenn diese Methoden (Pre, Post) waren Abstrakt, dann alle abgeleiteten Klassen würde müssen, um Sie zu implementieren (wahrscheinlich als leere Methoden) - code Wurf, die entfernt werden können mit leere virtuelle Methoden an der Basis.
Wenn es OBLIGATORISCH ist, zu überschreiben und keine default-Logik geschrieben werden kann in der Basis-Klasse, als Virtualität, ist, dass falsche und Methode sollte Abstrakt sein. Wenn die Standard-Aktion ist, nichts zu tun, als Adam erwähnt, leere virtuelle Methode in der Basisklasse ist perfekt gültige Struktur
Wenn Sie erklären die Methode als Abstrakt, die geerbten Klasse hat diese Methode zu überschreiben (eine Implementierung). Es ist zwingend erforderlich.
Wenn die Methode als virtual deklariert, der Erbe kann überschreiben Sie die Methode und stellen Sie eine Implementierung von anderen als den Standardwert.
Aus einer design-Perspektive das riecht schlecht und zeigt, dass die Implementierung das design ist in einem unreifen Zustand. Wenn eine Methode nicht erforderlich, die von jeder Klasse, die sich einer bestimmten Basis-Klasse, dann ist es per definition gehört nicht in die Basisklasse. In der Regel werden Sie entdecken, dass diese Methode verwendet wird, die durch bestimmte Ableitungen der Basisklasse und zeigt eine neue Oberfläche oder eine Ebene der Abstraktion, die in Ihrer Vererbungshierarchie.