AW: Reintroduce / Override bei Virtual / Dynamic im Bezug auf OOP - Prinzipien
Zitat:
Delphi-Quellcode:
Mit reintroduce kann ich dann den Sohn als Papa behandeln ohne das er sich noch wie der Sohn verhält, ohne die Papa-Klasse zu ändern und ohne gegen Regeln zu verstoßen.
Tpapa(Sohn).say;
|
AW: Reintroduce / Override bei Virtual / Dynamic im Bezug auf OOP - Prinzipien
Zitat:
Delphi-Quellcode:
Es wird alles funktionieren, nur der Compiler gibt eine Warnung aus ... mehr nicht
TBasis = class
procedure TuDasImmer; procedure TuNormalDasHier; virtual; end; TAbleitung = class( TBasis ) procedure TuNormalDasHier; override; end; TAbleitungAusnahme1 = class( TBasis ) procedure TuDasImmer; // Warnung end; TAbleitungAusnahme2 = class( TBasis ) procedure TuDasImmer; reintroduce; end; |
AW: Reintroduce / Override bei Virtual / Dynamic im Bezug auf OOP - Prinzipien
Das ist quasi der Sledge Hammer-Schalter:
Zitat:
|
AW: Reintroduce / Override bei Virtual / Dynamic im Bezug auf OOP - Prinzipien
Ich glaube er hat noch auf den kleinen Unterschied beim Cast auf eine Superklasse angespielt.
|
AW: Reintroduce / Override bei Virtual / Dynamic im Bezug auf OOP - Prinzipien
Auf StackOverflow gibt es imho eine sehr gute Antwort dazu. Dort wird darauf eingegangen, dass es beim LSP um die Austauschbarkeit der Klassen und eventuelle Pre und Postconditions geht.
|
AW: Reintroduce / Override bei Virtual / Dynamic im Bezug auf OOP - Prinzipien
Hmmm, da hatte ich doch für
Delphi-Quellcode:
etwas völlig falsches im Kopf ... tstststs ... (meine Kaffeemaschine zickt auch rum ... ob es da einen Zusammenhang gibt?)
reintroduce
Ok, alles was ich im Bezug auf
Delphi-Quellcode:
von mir gegeben habe am besten wieder vergessen.
reintroduce
Mit
Delphi-Quellcode:
können virtuelle Methoden überschrieben werden, wo sich die Parameterliste verändert.
reintroduce
Delphi-Quellcode:
TBase = class
procedure ShowMe( const Info : string ); virtual; end; // TFromBase1 kennt nur eine Methode ShowMe TFromBase1 = class( TBase ) procedure ShowMe( Info : integer ); reintroduce; end; // TFromBase2 kennt beide Methoden von ShowMe TFromBase2 = class( TBase ) procedure ShowMe( Info : integer ); overload; end; |
AW: Reintroduce / Override bei Virtual / Dynamic im Bezug auf OOP - Prinzipien
Da wird nichts überschrieben. Es schaltet nur die Wanung ab, wenn man etwas absichtlich "verdecken" (nicht "überschreiben") will.
Und das "Verdecken" bezieht sich nur auf den Namen und nicht auf die Parameter. Mit Overload gibt man an, daß man etwas Gleichnamiges, aber mit anderer Parametersignatur, "überladen" will. Alle Methoden existieren gleichzeitig innerhalb der selben Klasse, bzw. auf alle ist zugreifbar. Override "überschreibt" quasi die "Links", welche von Virtual oder Dynamic erstellt wurden. |
AW: Reintroduce / Override bei Virtual / Dynamic im Bezug auf OOP - Prinzipien
http://docwiki.embarcadero.com/RADSt...en#Reintroduce:
Zitat:
|
AW: Reintroduce / Override bei Virtual / Dynamic im Bezug auf OOP - Prinzipien
Frisch aus dem Mittagspäuschen!
Also ich fasse zusammen: "virtual" : speed optimiert "dynamic" : memory optimiert beide ermöglichen in einer vererbten Klasse override zu benutzen. Wobei virtual das zu bevorzugende Schlüsselwort ist. "abstract" : Methode sollte in der vererbten Klasse implementiert werden wenn man sie benutzen will. "overload" : hat damit erstmal nichts zu tun, sondern ermöglicht Methoden den gleichen Namen zu geben und durch die unterschiedlichen Signaturen der Methoden unterschiedliche Parameter zu empfangen und immer anders zu verarbeiten. "reintroduce" : Eine geerbte virtuelle Methode durch eine neue Deklaration verdecken. Wird die vererbte Klasse als die Basisklasse behandelt am Beispiel (TPapa(Sohn)) würde die Methode say von Tpapa aufgerufen werden, beim weglassen von "reintroduce" ist es eigentlich genauso, allerdings mit Warnung, welche ja berechtigt ist weil vielleicht Tpapa's Methode Abtract war und nicht existiert, Stichwort: AbstractError "override" : Verweißt auf die Methode der Vererbten Klasse, sodass immer diese aufgerufen wird und nicht die virtuelle methode der Elternklasse welche ja vielleicht abstract ist und dann nicht existiert und das aufrufen zu einem Fehler führen würde.
Delphi-Quellcode:
program Override_Reintroduce_Unterschied;
{$APPTYPE CONSOLE} uses SysUtils; type Tpapa = class public { public declarations } procedure say; virtual; abstract; end; Tsohn = class(Tpapa) public { public declarations } procedure say; override; end; var Sohn : Tsohn; procedure Tsohn.say; begin Writeln('Hi!'); end; begin try Sohn := TSohn.Create; TPapa(Sohn).say; ReadLn; { TODO -oUser -cConsole Main : Code hier einfügen } except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end. Ich habe das Gefühl es ein wenig verstanden zu haben. Thumbs Up |
AW: Reintroduce / Override bei Virtual / Dynamic im Bezug auf OOP - Prinzipien
Angenommen Ich habe eine Klassenmethode mit Virtual; kenntlich gemacht und erwarte das diese überdeckt werden soll. (Das ist ja die Bedeutung von Virtual;) Wieso brauche Ich dann ein Reintroduce in der Vererbten Klasse um eine Warnung zu unterdrücken? Ich müsste doch glücklich sein, wenn jemand meine Klassenmethode verbirgt...
Verborgen wird sie doch auch wenn Ich kein Virtual in der Elternklasse habe und kein Reintroduce in der vererbten Klasse. Das Gleiche Resultat habe ich auch wenn ich einfach nur in der vererbten Klasse Reintroduce einsetze ohne, dass in der Elternklasse etwas davon stand. Der einzige Sinn des Ganzen ist doch nur der, dass falls jemand meinte, das seine Methode in vererbten Klassen überschrieben werden sollte, ein virtual; verbaut. Und damit der, der die Erbung macht, sozusagen: "Ja, ist angekommen", zu verstehen geben kann, ein Reintroduce anhängt. Und der Compiler spielt hierbei die Rolle der Vermittelnden Person zwischen den beiden Programmierern. Quasi eine Compiler SMS :D Gut, jetzt weiß Ich wie der Hase läuft. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:46 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