AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Versuche Objektorientierung zu lernen

Ein Thema von foerster7892 · begonnen am 18. Feb 2012 · letzter Beitrag vom 19. Feb 2012
Antwort Antwort
Popov
(Gast)

n/a Beiträge
 
#1

AW: Versuche Objektorientierung zu lernen

  Alt 19. Feb 2012, 01: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 01:42 Uhr)
  Mit Zitat antworten Zitat
foerster7892

Registriert seit: 10. Okt 2007
Ort: Brieskow-Finkenheerd
181 Beiträge
 
#2

AW: Versuche Objektorientierung zu lernen

  Alt 19. Feb 2012, 13:51
Vielen Dank an alle hat mir unglaublich geholfen.



PS.: Das Beispiel war super!

mfg
foerster7892
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.388 Beiträge
 
Delphi 12 Athens
 
#3

AW: Versuche Objektorientierung zu lernen

  Alt 19. Feb 2012, 15:17
Wobei man noch froh sein kann, daß beim Zugriff auf "Count" keine Exception auftrat, denn schließlich war zu diesem Zeitpunkt die Stingliste noch nicht initialisiert.
Daß keine Exception auftrat, liegt am Inneren der Count-Funktion, wo glücklicher Weise auf nichts "Schlimmes"/Kompliziertes zugegriffen wird.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (19. Feb 2012 um 15:19 Uhr)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#4

AW: Versuche Objektorientierung zu lernen

  Alt 19. Feb 2012, 17:42
Meinst du mein Beispiel oben? Ich habe es mir gerade angeguckt, zwischen der Create der oberen Klasse und TObject Create steht nichts. Alles Leere. Und da Count - 1 eben -1 ergibt, läuft die Schleife kein einziges mal durch. Ich wollte zuerst Self[5] := 'Sonnabend' schreiben, aber das wäre dann zu heftig gewesen.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz