AW: Reintroduce / Override bei Virtual / Dynamic im Bezug auf OOP - Prinzipien
So ganz hast Du es anscheinend noch nicht.
- virtual /dynamic -> kann überschrieben werden - abstract -> muss überschrieben werden - override -> wird überschrieben - overload -> neue Methode gleichen Namens mit abweichender Signatur - reintroduce -> wird "neu eingeführt" und hat nichts mit der übergeordneten Klasse zu tun |
AW: Reintroduce / Override bei Virtual / Dynamic im Bezug auf OOP - Prinzipien
Wieso hat denn reintroduce nichts mit der übergeordneten Klasse zu tun?
Wenn ich die Vererbte Klasse als Element der Basisklasse betrachte und virtual / reintroduce in den entsprechenden Klassen verwendet habe Also: TPapa(Sohn).say; Dann wird die Funktion der Basisklasse aufgerufen obwohl es sich um eine Instanz der vererbten Klasse handelt? Wenn Ich override benutzt habe, dann haben die Klassen nichts mehr miteinander zu tun, weil ich die Elternmethode überschreibe... Die anderen Begrifflichkeiten habe Ich genauso verstanden wie du es aufgeschrieben hast. |
AW: Reintroduce / Override bei Virtual / Dynamic im Bezug auf OOP - Prinzipien
Lass doch mal Dein komisches Typecasting weg. Reintroduce unterdrückt wie schon weiter vorn gesagt die Warnung, wenn eine Methode verdeckt wird. Verdecken wiederum bedeutet ja, dass ich so tue, als gäbe es die Methode in der übergeordneten Klasse gar nicht.
|
AW: Reintroduce / Override bei Virtual / Dynamic im Bezug auf OOP - Prinzipien
Gut dann noch kurz eine Frage, gibt es einen Unterschied zwischen verdecken und überschreiben?
:) Ich weiß deine Geduld zu schätzen |
AW: Reintroduce / Override bei Virtual / Dynamic im Bezug auf OOP - Prinzipien
Ich würde jetzt halt noch gerne wissen bei welchem Aufruf / Fall der unterschied deutlich wird und mir fällt nichts außer dem typecast ein...
|
AW: Reintroduce / Override bei Virtual / Dynamic im Bezug auf OOP - Prinzipien
Das Stichwort heißt Polymorphie
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE} type TFoo = class procedure Something; virtual; end; TBar = class(TFoo) procedure Something; override; end; procedure TFoo.Something; begin Writeln('TFoo.Something'); end; procedure TBar.Something; begin Writeln('TBar.Something'); end; var foo: TFoo; begin foo := TBar.Create; foo.Something; // Ausgabe bei override: TBar.Something - Ausgabe bei reintroduce: TFoo.Something; Readln; end. |
AW: Reintroduce / Override bei Virtual / Dynamic im Bezug auf OOP - Prinzipien
Ja. Schau Dir einmal dieses Beispiel an:
Delphi-Quellcode:
Siehe dazu auch http://docwiki.embarcadero.com/RADSt..._und_Verdecken
type
TSomeClass = class protected procedure DoSomethingVirtual; virtual; procedure DoSomething; virtual; end; TSomeOtherClass = class(TSomeClass) public procedure DoSomethingVirtual; override; //Überschreiben procedure DoSomething; reintroduce; //Verdecken end; { TSomeClass } procedure TSomeClass.DoSomething; begin ShowMessage('TSomeClass.DoSomething'); end; procedure TSomeClass.DoSomethingVirtual; begin ShowMessage('TSomeClass.DoSomethingVirtual'); end; { TSomeOtherClass } procedure TSomeOtherClass.DoSomething; begin ShowMessage('TSomeOtherClass.DoSomething'); end; procedure TSomeOtherClass.DoSomethingVirtual; begin inherited; ShowMessage('TSomeOtherClass.DoSomethingVirtual'); end; procedure TForm14.Button1Click(Sender: TObject); var aClass: TSomeClass; //Variable vom Typ der Elternklasse begin //Instanz der Kindklasse anlegen aClass := TSomeOtherClass.Create; try //Methode der Kindklasse wird aufgerufen aClass.DoSomethingVirtual; //Methode der Elternklasse wird aufgerufen aClass.DoSomething; finally aClass.Free; end; end; [edit] Kein roter Kasten [/edit] |
AW: Reintroduce / Override bei Virtual / Dynamic im Bezug auf OOP - Prinzipien
Bleibt noch zu sagen: Danke für die ganze Unterstützung. :thumb:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz