Vererbung und virtuelle Methoden

Vererbung, virtuelle Methoden, override, reintroduce

Beispiel für Klassenvererbung

Object Pascal unterstützt Vererbung und virtuelle Methoden. Im folgenden Beispiel erbt TDog von TAnimal:

TDog ist die Unterklasse (abgeleitete Klasse), TAnimal die Oberklasse (Basisklasse)

program AnimalDemo;
{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}
{$codepage utf8}
uses SysUtils;

type
  // Oberklasse für Tiere
  TAnimal = class
    procedure Cry; virtual; // Virtuelle Methode: Tierlaut
  end; // Ende der Klassendefinition, nur end; nötig

  // Unterklasse Hund, erbt Tier und überschreibt Laut
  TDog = class(TAnimal)
    procedure Cry; override;
  end;

procedure TAnimal.Cry;
begin
  WriteLn('Das Tier gibt einen Laut von sich');
end;

procedure TDog.Cry;
begin
  WriteLn('Wau wau wau');
end;

var
  Pet: TAnimal;
begin
  // Instanz der Oberklasse
  Pet := TAnimal.Create;
  try
    Pet.Cry;
  finally
    FreeAndNil(Pet);
  end;

  // Unterklasseninstanz in Oberklassenvariable speichern, Polymorphismus aktiv
  Pet := TDog.Create;
  try
    Pet.Cry;
  finally
    FreeAndNil(Pet);
  end;
end.Code-Sprache: JavaScript (javascript)

Ausgabeergebnis

D:\fpcdemo>fpc mydemo.dpr
Free Pascal Compiler version 3.2.2 [2021/05/15] for i386
Copyright (c) 1993-2021 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling mydemo.dpr
Linking mydemo.exe
45 lines compiled, 0.1 sec, 68544 bytes code, 4260 bytes data

D:\fpcdemo>mydemo
Das Tier gibt einen Laut von sich
Wau wau wauCode-Sprache: CSS (css)

FreeAndNil

Sicheres Freigeben von Objekten, zwei Schritte kombiniert:

  1. Aufruf von Free am Objekt zum Freigeben des Speichers;
  2. Setzen der Variable auf nil, um hängende Zeiger zu vermeiden.

Der obige Code speichert ein Objekt der Unterklasse TDog in einer Variable vom Typ TAnimal namens Pet. Ruft man über Pet die Methode Cry auf, wird die Cry-Implementierung aus TDog ausgeführt, nicht die aus TAnimal – das ist Polymorphismus.

  • Cry; virtual markiert die Oberklassenmethode als virtuell und aktiviert Laufzeitpolymorphismus;
  • Die Unterklasse überschreibt Cry mit dem Schlüsselwort override;
  • Die Variable ist als TAnimal deklariert, enthält aber eine echte TDog-Instanz, wodurch automatisch die Hundelaut-Methode läuft.

Bei mit virtual markierten Methoden löst der Compiler zur Laufzeit die passende Methodenimplementierung anhand des echten Typs des Objekts auf.

Entfernt man virtual und override

Beide Aufrufe führen die Methode der Oberklasse aus

Das obige Bild zeigt das Ergebnis nach Entfernen von virtual und override

Alle Ausgaben stammen aus der TAnimal-Implementierung

Der Compiler berücksichtigt nur den deklarierten Variablentyp TMyClass und ignoriert den echten Laufzeittyp des Objekts.

  • Normale Methoden sind standardmäßig nicht virtuell, nur das Schlüsselwort virtual macht sie virtuell;
  • Zum Überschreiben einer geerbten virtuellen Methode in der Unterklasse ist override zwingend erforderlich, sonst gibt der Compiler eine Warnung aus;
  • Verwende reintroduce, wenn du eine gleichnamige virtuelle Methode der Oberklasse verstecken, aber nicht überschreiben möchtest (nicht empfohlen, sorgt für Verwirrung), entspricht dem new-Schlüsselwort in C#

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert