Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Beispiel für Polymorphie gesucht (https://www.delphipraxis.net/15405-beispiel-fuer-polymorphie-gesucht.html)

Luckie 28. Jan 2004 08:13


Beispiel für Polymorphie gesucht
 
Ich arbeite gerade an einem Tutorial über Klassen in Delphi. Zum Thema Polymorphie habe ich mir folgendes Demo geschrieben:
Unit1:
Delphi-Quellcode:
uses
  Family;

procedure TForm1.btnParentsClick(Sender: TObject);
var
  Parents: TParent;
begin
  Parents := TParent.Create;
  try
    ShowMessage(Parents.GetType);
  finally
    FreeAndNil(Parents);
  end;
end;

procedure TForm1.btnSonClick(Sender: TObject);
var
  Son: TParent;
begin
  Son := TSon.Create;
  try
    ShowMessage(Son.GetType);
  finally
    FreeAndNil(Son);
  end;
end;
Und die Unit Family mit der Klasse:
Delphi-Quellcode:
unit Family;

interface

type
  TParent = class(TObject)
  public
    function GetType: String; virtual; // zum Überschreiben markieren
  end;

type
  TSon = class(TParent)
  public
    function GetType: String; override; // Eltern-Methode überschrieben
  end;

implementation

////////////////////////////////////////////////////////////////////////////////
//
//  TParent.GetType
//
//    Verwandtschaftsbeziehung.

function TParent.GetType: String;
begin
  result := 'Eltern';
end;

////////////////////////////////////////////////////////////////////////////////
//
//  TSon.GetType
//
//    Verwandtschaftsbeziehung.

function TSon.GetType: String;
begin
  result := 'Sohn';
end;

end.
Ich bin damit allerdings noch nicht so ganz glücklich. Hat eventuell jemand eine bessere Idee? Es sollte möglichst einfach und übersichtlich sein. Eventuell reicht es ja schon die Methoden besser zu benennen oder nur etwas zu ergänzen.

Es wäre auch schön, wenn man die Operatoren as und is einbauen könnte.

Sanchez 28. Jan 2004 08:27

Re: Beispiel für Polymorphie gesucht
 
Ich würde deine beiden Klassen durch eine abstrakte Oberklasse erweitern:

Delphi-Quellcode:
unit Family;

interface

type
  TFamilyMember = class(TObject)
  public
    function GetType: String; virtual; abstract; // muss Überschrieben werden
  end;

type
  TParent = class(TFamilyMember)
  public
    function GetType: String; override; // FamilyMember-Methode überschrieben
  end;

type
  TSon = class(TFamilyMember)
  public
    function GetType: String; override; // FamilyMember-Methode überschrieben
  end;

implementation

////////////////////////////////////////////////////////////////////////////////
//
//  TParent.GetType
//
//    Verwandtschaftsbeziehung.

function TParent.GetType: String;
begin
  result := 'Eltern';
end;

////////////////////////////////////////////////////////////////////////////////
//
//  TSon.GetType
//
//    Verwandtschaftsbeziehung.

function TSon.GetType: String;
begin
  result := 'Sohn';
end;

end.
Denn dein Beispiel würde ja bedeuten, dass der Sohn eine Art von Elternteil ist.

grüße, daniel

choose 28. Jan 2004 08:33

Re: Beispiel für Polymorphie gesucht
 
Hallo Luckie,

schön, dass Du Dir die Mühe machen willst. Vielleicht kannst Du bei der Gelegenheit auch gleich den Begriff der abstrakten Klasse einführen? Oft wird die Eleganz von Lösungen dieser Art verkannt, obgleich mit ihnen etwas verwirrende Zuweisungen der Art
Delphi-Quellcode:
var
  myParent: TParent;
begin
  myParent:= TChild.Create;
vermieden werden können...

Ich dachte an eine Klassifizierungslösung (ala Aristoteles), also eine Form der Spezialisierung, wobei ich aus Vereinfachungsgründen die Spezialisierung selbst (zB in Form neuer Operationen) nur geringfügig (Im Fall der Zitrusfrucht) beachte:
Delphi-Quellcode:
type
  TFruit = class //pure abstract class
  public
    function GetTaste: string; virtual; abstract;
  end;

  TCitrusFruit = class(TFruit) //pure abstract class introduces new ops
  public
    procedure Squeeze; virtual; abstract;
  end;

  TLemon = class(TCitrusFruit) // same taste as citrus fruit
  public
    function GetTaste: string; override; // acerbic
    procedure Squeeze; override;
  end;
   
  TGrapefruit(TCitrusFruit) = class
  public
    function GetTaste: string; override; // disgustful ;)
    procedure Squeeze; override;
  end;
 
  TBanana(TFruit) = class
  public
    function GetTaste: string; override; // sugary
  end;
Mit einer Hierarchie dieser Art ist die Verwendung etwas "natürlicher"
Delphi-Quellcode:
type
  myFruit: TFruit;
begin
  myFruit:= TBanana.Create;
  myFruit.GetTaste;
und lässt ebenfalls "natürliche" Casts etc zu
Delphi-Quellcode:
if myFruit is TCitrusFruit then
  with myFruit as TCitrusFruit do
    Squeeze;
Edit: Vorfahren der Klassen angegeben

Luckie 28. Jan 2004 08:33

Re: Beispiel für Polymorphie gesucht
 
:thumb: Dann wäre auch das Schlüsselwort abstract drin.

@Choose: Da mus sich jetzt erstmal durchsteigen. :? :-/

Treffnix 28. Jan 2004 08:42

Re: Beispiel für Polymorphie gesucht
 
@ choose: Und das klappt so? Woher weiss Delphi denn, dass TLemon eine TCitrusfrucht ist? :gruebel:

[ot] Irgendwie hab ich jetzt Lust auf frischgepressten O-Saft :stupid: [/ot]

Luckie 28. Jan 2004 08:45

Re: Beispiel für Polymorphie gesucht
 
Fehler von Choose, da fehlt überall die Angabe des Parents. ;)

Treffnix 28. Jan 2004 08:57

Re: Beispiel für Polymorphie gesucht
 
Hab ich mir auch gedacht. Aber ich war am grübeln, ob er das vielleicht mit der Eleganz meinte. Bei choose weiss man ja nie... :wink:

choose 28. Jan 2004 08:59

Re: Beispiel für Polymorphie gesucht
 
Zitat:

Zitat von Treffnix
Bei choose weiss man ja nie...

Das denke ich mir auch manchmal ;)

Habe tatsächlich in der Eile die Vorfahren vergessen, schön, dass das Beispiel trotzdem verstanden wurde!

Luckie 29. Jan 2004 11:10

Re: Beispiel für Polymorphie gesucht
 
@Choose: was hast du denn jetzt genmacht? :shock:
Delphi-Quellcode:
TGrapefruit(TCitrusFruit) = class
Was gibt denn das, wenn es fertig wird? :gruebel:

Treffnix 29. Jan 2004 11:16

Re: Beispiel für Polymorphie gesucht
 
Zitat:

Was gibt denn das, wenn es fertig wird?
Obstalat? :angle2:


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:02 Uhr.
Seite 1 von 4  1 23     Letzte »    

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