![]() |
Re: virtual / override ??
Eigentlich ist es ganz simpel, wenn man den Überblick hat:
Es gibt grundsätzlich die Unterscheidung zwischen statischen und virtuellen Methoden. Die dynamischen rechne ich jetzt den virtuellen zu, da diese sich im Laufzeitverhalten nicht von den virtuellen unterscheiden. Klassen sind im wesentlichen nichts weiter als erweiterte Records. Eine Klasse enthält zunächst einen Zeiger auf die Virtual Method Table, dann die Felder und dann die Methoden. Statische Methoden heißen statisch, weil ihre Adresse zur Compilierzeit feststeht. Eine statische Methode wird vom Compiler also wie eine gewöhnliche Funktion behandelt, wenn der Code erzeugt wird. Es wird nur zusätzlich eine Referenz auf das bezogene Objekt mitgegeben. Bei virtuelle Methoden dagegen wird erst zur Laufzeit die Adresse ermittelt. Das geschieht mit Hilfe der VMT (s.o)., in der u.a. die Adressen der virtuellen Methoden stehen. Nun schaue man sich folgendes an:
Delphi-Quellcode:
type
TMyStaticClass = class public procedure DoSomething; end; TMyStaticDerivedClass = class public procedure DoSomething; end; TMyVirtualClass = class public procedure DoSomething; virtual; end; TMyVirtualDerivedClass = class public procedure DoSomething; override; end; procedure TMyStaticClass.DoSomething; begin ShowMessage('1'); end; procedure TMyStaticDerivedClass.DoSomething; begin ShowMessage('2'); end; procedure TMyVirtualClass.DoSomething; begin ShowMessage('3'); end; procedure TMyVirtualDerivedClass.DoSomething; begin ShowMessage('4'); end; So, jetzt probieren wir etwas rum:
Delphi-Quellcode:
Hier wird '1' ausgegeben. Warum, es wird doch eine Instanz von TMyStaticDerviedClass erzeugt? Ja, aber der Typ der Variablen ist TMyStaticClass, und Typen werden zur Compilierzeit ausgewertet.
var
o: TMyStaticClass; begin o := TMyStaticDerivedClass.Create; o.DoSomething; end; Schauen wir uns das ganze mal virtuell an:
Delphi-Quellcode:
Hier wird nun 4 ausgegeben. Wir erinnern uns, jedes Objekt enthält einen Zeiger auf die VMT. Dadurch kann zur Laufzeit, obwohl der tatsächliche Typ unbekannt bzw. maskiert ist, die Adresse der entsprechenden virtuelle Methode ermittelt werden.
var
o: TMyVirtualClass; begin o := TMyVirtualDerivedClass.Create; o.DoSomething; end; Nun zu override: Um zu kennzeichnen, dass wir eine virtuelle Methode überschreiben wollen, müssen wir dem override angeben. Die Methode bleibt dadurch virtuell, keine Angst. Geben wir aber kein override an, so verdecken wir die virtuelle Methode. Der Compiler teilt uns das mit, weil er denkt, wir wollen das nicht so. Wenn wir das aber doch wollen, müssen wir ihm das explizit sagen, und dafür ist reintroduce da. |
Re: virtual / override ??
Zitat:
|
Re: virtual / override ??
Zitat:
|
Re: virtual / override ??
Hier mal dazu der Auszug bei Wikipedia:
![]() Könnte durchaus stimmen. Sowas passiert, wenn eine Wissenschaft mit Lichtgeschwindigkeit aus den Universitäten in die Wirtschaft braust 8) |
Re: virtual / override ??
Ist doch immer wieder schön, wenn 2 gegensätzliche Meinungen derart zusammengeführt werden können, dass keiner von seiner Position abrücken muss, und trotzdem beide Recht erhalten :mrgreen: :stupid:
Dass die Macianer da komisch sind war ja wieder klar... (jaja, ich weiss, eigentlich machen sie's richtig...) |
Re: virtual / override ??
Zitat:
|
Re: virtual / override ??
Hi!
Eigentlich hat Chewie doch alles erklärt?! Was ist dir noch unklar? Ciao Frederic |
Re: virtual / override ??
mit override überschreibst du die (in diesem fall) prozedur des vorgängers, d.h du kannst die vorgänger prozedur mit "inherited prozedur" aufrufen und noch "eigenes zeugs" mit rein machen.... würdest du kein override benutzen, würde die alte prozedur durch deine neue ersetzt werden und den vorgänger könntest du nichtmehr aufrufen (wenn was falsch war, bitte sagen^^)
|
Re: virtual / override ??
Also : "abstract" darf in der Basisklasse nicht implementiert werden. Es ist wie der Name schon sagt abstrakt. Vorerst also ohne konkrete Bedeutung. In abgeleiteten Klassen kann sich das ändern.
Nun habe ich allerdings keine Lust etwas eventuell überflüssiges zu programmieren. Deshalb verwende ich jetzt nur "virtual", um die Grundlage der Vererbung zu schaffen. Die Basisklasse wird also schon für einen konkreten Zweck gefüllt und kann bei Bedarf überschrieben werden. "abstract" ist eher was für Komponentenentwickler, die beim besten Willen nicht wissen können, was später daraus wird. Da geht es mehr oder weniger nur darum, den Namen einer Methode zu reservieren. Nun aber, was ist mit "override" :?: |
Re: virtual / override ??
override braucht man normal nicht. das ist nur dann zu gebrauchen, wenn du bewusst in einer abgeleiteten klasse etwas von der basisklasse ÜBERSCHREIBEN willst. also nicht hinzufügen sondern WEGMACHEN.
abstract/virtual hat gegenüber nur virtual den vorteil, dass bei virtual in der abgeleiteten version nichts hinzugefügt werden muss, man also theoretisch eine instanz von einem objekt mit nur gerüst-funktion erstellen kann. hängt noch ein abstract dran, kann man zwar zunächst nichts programmieren, aber man kann vin den abgeleiteten klassen keine instantiieren, falls nicht jede abstrakte funktion "overrided" ist - d.h. programmiert wurde, |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz