Mir ist gerade ein nettes Beispiel eingefallen, ich hoffe es ist gut.
Es zeigt, wie ich hoffe, gut wozu der constructor, aber vor allem inherited gut ist. Ich habe eine Klasse von TStringList abgeleitet und im constructor Create mit Wochentagen gefüllt. Wenn ich nun in der Prozedur Button1Click das Objekt erstelle und gleich mit ShowMessage anzeigen lasse, ist die Liste bereits mit Daten gefüllt.
Ansonsten ist das eine normale StringList, ich kann also den Inhalt löschen oder bearbeiten. Aber als Unterschied zu StringList hatte sie am Anfang Daten drin.
Nun mal ein kleines Experiment: mal in
TWochenTageListe.Create
inherited auskommentieren.
Was sehen wir? Eigentlich keinen Unterschied(²). In beiden Fällen wird beim Klick auf Button
1 eine Liste ausgegeben.
Ok, inherited wieder einsetzten und zum zweiten Beispiel unten gehen.
Delphi-Quellcode:
// --------- Eine Liste mit Wochentagen für Deutschland ----------------
// ----------------- Abgeleitet von TStringList ------------------------
type
TWochenTageListe = class(TStringList)
constructor Create;
end;
constructor TWochenTageListe.Create;
begin
inherited; // teste die Klasse mit inherited und ohne
Add('Montag');
Add('Dienstag');
Add('Mittwoch');
Add('Donnerstag');
Add('Freitag');
Add('Samstag');
Add('Sonntag');
end;
procedure TForm1.Button1Click(Sender: TObject);
var
slWochenTage: TWochenTageListe;
begin
slWochenTage := TWochenTageListe.Create;
try
ShowMessage(slWochenTage.Text);
finally
slWochenTage.Free;
end;
end;
Das oben war eine Liste für Deutschland. In Bayern sagt man aber nicht Samstag, sondern Sonnabend. Wir erstellen nun eine extra Klasse für die Bayern, aber keine neue Liste, sondern leiten die WochenTageListe für Bayern aus der WochenTageListe für Deutschland ab und ändern lediglich den Samstag in Sonnabend. Da wir die Klasse ableiten, erben wir die Liste, allerdings nur wenn wir inherited aufrufen.
Wieder ein kleines Experiment: mal in
TBayernWochenTageListe.Create
inherited auskommentieren.
Was sehen wir? Nichts! Wenn wir auf Button
2 klicken, ist die Liste leer. Nicht mal Sonnabend steht drin. Mit inherited wird die Wochentage Liste geerbt, ohne nicht.
Delphi-Quellcode:
// ----------- Eine Liste mit Wochentagen für Bayern -------------------
// --------------- Abgeleitet von TWochenTageListe----------------------
type
TBayernWochenTageListe = class(TWochenTageListe)
constructor Create;
end;
constructor TBayernWochenTageListe.Create;
var
i: Integer;
begin
inherited; // teste die Klasse mit inherited und ohne
for i := 0 to Count - 1 do
if Self[i] = 'Samstag' then Self[i] := 'Sonnabend';
end;
procedure TForm1.Button2Click(Sender: TObject);
var
slWochenTage: TBayernWochenTageListe;
begin
slWochenTage := TBayernWochenTageListe.Create;
try
ShowMessage(slWochenTage.Text);
finally
slWochenTage.Free;
end;
end;
Und noch ein letztes Experiment: wir setzen inherited nicht wie es soll am Anfang des constructors, sondern am Ende der Prozedur.
Was sehen wir? Eine Liste, aber kein Sonnabend, sondern Samstag. Als in der Schleife nach Samstag gesucht wurde, war die Liste noch nicht da.
Delphi-Quellcode:
constructor TBayernWochenTageListe.Create;
var
i: Integer;
begin
//inherited; //Auskommentiert
for i := 0 to Count - 1 do
if Self[i] = 'Samstag' then Self[i] := 'Sonnabend';
inherited; // inherited am Ende
end;
² - Damit meine ich keinen sichtbaren Unterschied in Bezug auf das Experiment.