Einzelnen Beitrag anzeigen

Benutzerbild von Jonas Shinaniganz
Jonas Shinaniganz

Registriert seit: 30. Aug 2011
249 Beiträge
 
Delphi XE5 Ultimate
 
#19

AW: Reintroduce / Override bei Virtual / Dynamic im Bezug auf OOP - Prinzipien

  Alt 28. Feb 2012, 13:13
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
  Mit Zitat antworten Zitat