Einzelnen Beitrag anzeigen

Benutzerbild von Bowler
Bowler

Registriert seit: 8. Sep 2003
Ort: Bochum
148 Beiträge
 
Delphi XE7 Enterprise
 
#12

Re: [OOP]: sinnvolle Vererbung

  Alt 3. Sep 2004, 13:01
Hm..ok, ich versuchs.

Also, Polymorphie bedeutet, dass Du ein Attribut mit dem Typ Deiner Basis-Klasse anlegst, und dann - wenn Du das Objekt letztendlich mit .Create erzeugst - nichtmehr die Basis-Klasse erstellst, sondern eine davon abgeleitete Klasse.

Hier das ganze mal als Code:

Delphi-Quellcode:
type
  TBasisKlasse = class(TObject)
  public
     iErgebnis:integer;
     procedure Berechne(a,b:integer);
  end;

  TAddierenKlasse = class(TBasisKlasse)
  public
    procedure Berechne(a,b:integer); override;
  end;

  TSubtrahierenKlasse = class(TBasisKlasse)
  public
    procedure Berechne(a,b:integer); override;
  end;
Dann die Implementierung:

Delphi-Quellcode:
procedure TBasisKlasse.Berechne(a,b:integer);
begin
  // Dummy-Funktion
end;

procedure TAddierenKlasse .Berechne(a,b:integer);
begin
  self.Ergebnis=a+b;
end;

procedure TSubtrahierenKlasse .Berechne(a,b:integer);
begin
  self.Ergebnis=a-b;
end;
Dadurch hast Du eine Basisklasse, und 2 davon abgeleitete Klassen, mit der gleichen Funktion. Beide funktionen machen etwas unterschiedliches. In der Funktion der Basisklasse steht nichts, da es sich um eine leere Dummy-Funktion handelt.

Im Deinem Programm dann:

Delphi-Quellcode:
var
  meinMatheObejkt:TBasisKlasse;

function Addieren;
begin
  meinMatheObjekt:=TAddierenKlasse.Create;
  meinMatheObjekt.Berechne(10,5);
  ShowMessage(IntToStr(meinMatheObjekt.Ergebnis)); // = 15
  FreeAndNil(meinMatheObjekt);
end;

function Subtrahieren;
begin
  meinMatheObjekt:=TSubtrahierenKlasse.Create;
  meinMatheObjekt.Berechne(10,5);
  ShowMessage(IntToStr(meinMatheObjekt.Ergebnis)); // = 5
  FreeAndNil(meinMatheObjekt);
end;
Das mal zum Thema Polymorphie (ich hoffe, es ist soweit richtig @all ).

Das würde in Deinem Konkreten Fall bedeuten, dass Du in Deiner TMyNewList-Klasse kein Attribut für einen Knoten einbinden musst, sondern das Attribut aus der Mutterklasse lassen kannst (TKnoten). Wenn Du nun die TKnoten-Klasse erweitern willst, dass z.B. im Kontruktor noch etwas mehr passiert, als in TKnoten, dann leitest Du dir von TKnoten eine neue Klasse ab (TNewKnoten).
In den Methoden Deiner TMyNewListe kannst Du dann in Dein Wurzel-Attribut, welches Du aus der Mutterklasse hast und von Typ TKnoten ist, ein Objekt vom Typ TNewKnoten erzeugen.

D.h, Du kannst zu Laufzeit entscheiden, welches Objekt letzten Endes in dem Attribut vorhanden ist.


Hui, ganz schön viel stoff. Ich hoffe, es hilft dir.

Gruß
Christian
Christian Rüsken
  Mit Zitat antworten Zitat