Einzelnen Beitrag anzeigen

Popov
(Gast)

n/a Beiträge
 
#18

AW: Versuche Objektorientierung zu lernen

  Alt 19. Feb 2012, 02:25
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 Button1 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 Button2 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] = 'Samstagthen 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] = 'Samstagthen Self[i] := 'Sonnabend';

  inherited; // inherited am Ende
end;

² - Damit meine ich keinen sichtbaren Unterschied in Bezug auf das Experiment.

Geändert von Popov (19. Feb 2012 um 02:42 Uhr)
  Mit Zitat antworten Zitat