Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi [OOP]: sinnvolle Vererbung (https://www.delphipraxis.net/29054-%5Boop%5D-sinnvolle-vererbung.html)

Stevie 3. Sep 2004 12:45

Re: [OOP]: sinnvolle Vererbung
 
Zitat:

Zitat von mytar
@Bowler: Wie bitte? Könntest du das etwas einfacher erklären?

:gruebel: *sichanschließ*

Bowler 3. Sep 2004 13:01

Re: [OOP]: sinnvolle Vererbung
 
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. :-D

Gruß
Christian

Stevie 3. Sep 2004 13:13

Re: [OOP]: sinnvolle Vererbung
 
Zitat:

Zitat von Bowler
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.

WAAAS??? Das Wurzel-Objekt ist doch bereits erstellt und du kannst es doch nicht einfach überschreiben!!! Was passiert denn dann, wenn die Mutterklasse auf das Teil zugreift? Deshalb hab ich doch gesagt, man muss die alten Werte erst retten!

P.S.: Ein virtual abstract in der abstrakten Klasse erspart dir das schreiben einer Dummy-Methode! ;-)

maximov 3. Sep 2004 13:14

Re: [OOP]: sinnvolle Vererbung
 
Zitat:

Zitat von Bowler
Hm..ok, ich versuchs.
...
Delphi-Quellcode:
type
  TBasisKlasse = class(TObject)
  public
     iErgebnis:integer;
     procedure Berechne(a,b:integer);
  end;

 ...

Da fehlt wohl ein virtual. Und da diese klasse ja eh nix kann, macht es sinn wenn man diese als auch abstract deklariert. Dh. in der basis klasse sind nur (oder fast nur) methoden ohne implementierung deklariert - was dazu führt das die ableitungen die funktionalität, mittels override, zwingend implementieren müssen. Dann kann man immer von fähigkeiten der basis-klasse ausgehen - diese spezielle implementierung kann in den unterklassen stark abweichen :-D

Delphi-Quellcode:
procedure Berechne(a,b:integer); virtual; abstract;
:-D

Stevie 3. Sep 2004 13:16

Re: [OOP]: sinnvolle Vererbung
 
Zitat:

Zitat von maximov
Delphi-Quellcode:
procedure Berechne(a,b:integer); virtual; abstract;

Zitat:

Zitat von Stevie
P.S.: Ein virtual abstract in der abstrakten Klasse erspart dir das schreiben einer Dummy-Methode! ;-)

:mrgreen:

Bowler 3. Sep 2004 13:20

Re: [OOP]: sinnvolle Vererbung
 
Sorry, wusste nicht, dass das Wurzel-Objekt schon erstellt ist.

Phoenix 3. Sep 2004 13:31

Re: [OOP]: sinnvolle Vererbung
 
Zitat:

Zitat von Stevie
WAAAS??? Das Wurzel-Objekt ist doch bereits erstellt und du kannst es doch nicht einfach überschreiben!!! Was passiert denn dann, wenn die Mutterklasse auf das Teil zugreift? Deshalb hab ich doch gesagt, man muss die alten Werte erst retten!

Erm. Nee, das wäre ein Designfehler.

Das Wurzelobjekt wird doch bereits als abgeleitete Klasse erzeugt, damit kann die Mutter demnach auf alle Basismethoden wie gehabt darauf zugreifen.

Beispiel:
Delphi-Quellcode:
TListe = class
   wurzel: TItem;
   wurzelklasse: TItemClass;
   function Hinzufuegen: TItem;
   constructor Create(itemklasse: TItemClass);
end;

TItem = class
end;

TItemClass = Class of TItem;

TMyItem = class
end;

TMyItemClass = class of TMyItem;

constructor TListe.Create(itemklasse: TItemClass);
begin
   wurzelklasse := itemklasse;
end;

function TListe.Hinzufuegen: TItem;
begin
   result := wurzelklasse.Create;
end;


Nun kann man mit
Delphi-Quellcode:
var
   l_liste: TLIste;
   l_item: TItem;
   l_myItem: TMyItem;
begin
   l_liste := TListe.Create(TItemClass);
   l_item := l_liste.Hinzufuegen;

   l_liste.Free;
   l_liste := TLIste.Create(TMyItemClass);
   l_myItem := l_liste.Hinzufzuegen as TMyItem;
end;
alle beliebigen abgeleiteten Items direkt durch die Basisliste instanzieren lassen.

Stevie 3. Sep 2004 13:39

Re: [OOP]: sinnvolle Vererbung
 
Ja, sicher, ich bin aber davon ausgegangen, dass er von TMyList ableiten möchte ohne dass er dort irgendwas ändert und trotzdem auch das Wurzel-Objekt eine vom alten Wurzel-Objekt abgeleitete Klasse hat!

maximov 3. Sep 2004 15:11

Re: [OOP]: sinnvolle Vererbung
 
Zitat:

Zitat von Stevie
Zitat:

Zitat von maximov
Delphi-Quellcode:
procedure Berechne(a,b:integer); virtual; abstract;

Zitat:

Zitat von Stevie
P.S.: Ein virtual abstract in der abstrakten Klasse erspart dir das schreiben einer Dummy-Methode! ;-)

:mrgreen:

Ja toll :? Du warst schnell - du bist der sieger :stupid:

// edit: OK. Ich verzeihe dir :mrgreen:

Stevie 3. Sep 2004 15:16

Re: [OOP]: sinnvolle Vererbung
 
Zitat:

Zitat von maximov
Ja toll :? Du warst schnell - du bist der sieger :stupid:

Nein, so war das nicht gemeint!!! :oops: Ich fand's nur witzig, weil mir das noch nachträglich eingefallen ist und ich dann den Beitrag nochmal editiert hab. Und in diesem Moment kam dein Post. :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:27 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz