AGB  ·  Datenschutz  ·  Impressum  







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

[OOP]: sinnvolle Vererbung

Ein Thema von mytar · begonnen am 3. Sep 2004 · letzter Beitrag vom 8. Sep 2004
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#11

Re: [OOP]: sinnvolle Vererbung

  Alt 3. Sep 2004, 12:45
Zitat von mytar:
@Bowler: Wie bitte? Könntest du das etwas einfacher erklären?
*sichanschließ*
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
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
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#13

Re: [OOP]: sinnvolle Vererbung

  Alt 3. Sep 2004, 13:13
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!
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von maximov
maximov

Registriert seit: 2. Okt 2003
Ort: Hamburg
548 Beiträge
 
Delphi 2005 Professional
 
#14

Re: [OOP]: sinnvolle Vererbung

  Alt 3. Sep 2004, 13:14
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

procedure Berechne(a,b:integer); virtual; abstract;
mâxîmôv.

{KDT}
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#15

Re: [OOP]: sinnvolle Vererbung

  Alt 3. Sep 2004, 13:16
Zitat von maximov:
procedure Berechne(a,b:integer); virtual; abstract;
Zitat von Stevie:
P.S.: Ein virtual abstract in der abstrakten Klasse erspart dir das schreiben einer Dummy-Methode!
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von Bowler
Bowler

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

Re: [OOP]: sinnvolle Vererbung

  Alt 3. Sep 2004, 13:20
Sorry, wusste nicht, dass das Wurzel-Objekt schon erstellt ist.
Christian Rüsken
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.606 Beiträge
 
#17

Re: [OOP]: sinnvolle Vererbung

  Alt 3. Sep 2004, 13:31
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.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#18

Re: [OOP]: sinnvolle Vererbung

  Alt 3. Sep 2004, 13:39
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!
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von maximov
maximov

Registriert seit: 2. Okt 2003
Ort: Hamburg
548 Beiträge
 
Delphi 2005 Professional
 
#19

Re: [OOP]: sinnvolle Vererbung

  Alt 3. Sep 2004, 15:11
Zitat von Stevie:
Zitat von maximov:
procedure Berechne(a,b:integer); virtual; abstract;
Zitat von Stevie:
P.S.: Ein virtual abstract in der abstrakten Klasse erspart dir das schreiben einer Dummy-Methode!
Ja toll Du warst schnell - du bist der sieger

// edit: OK. Ich verzeihe dir
mâxîmôv.

{KDT}
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#20

Re: [OOP]: sinnvolle Vererbung

  Alt 3. Sep 2004, 15:16
Zitat von maximov:
Ja toll Du warst schnell - du bist der sieger
Nein, so war das nicht gemeint!!! 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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 22:13 Uhr.
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