![]() |
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:
Und die Unit Family mit der Klasse:
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;
Delphi-Quellcode:
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.
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. Es wäre auch schön, wenn man die Operatoren as und is einbauen könnte. |
Re: Beispiel für Polymorphie gesucht
Ich würde deine beiden Klassen durch eine abstrakte Oberklasse erweitern:
Delphi-Quellcode:
Denn dein Beispiel würde ja bedeuten, dass der Sohn eine Art von Elternteil ist.
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. grüße, daniel |
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:
vermieden werden können...
var
myParent: TParent; begin myParent:= TChild.Create; 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:
Mit einer Hierarchie dieser Art ist die Verwendung etwas "natürlicher"
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;
Delphi-Quellcode:
und lässt ebenfalls "natürliche" Casts etc zu
type
myFruit: TFruit; begin myFruit:= TBanana.Create; myFruit.GetTaste;
Delphi-Quellcode:
Edit: Vorfahren der Klassen angegeben
if myFruit is TCitrusFruit then
with myFruit as TCitrusFruit do Squeeze; |
Re: Beispiel für Polymorphie gesucht
:thumb: Dann wäre auch das Schlüsselwort abstract drin.
@Choose: Da mus sich jetzt erstmal durchsteigen. :? :-/ |
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] |
Re: Beispiel für Polymorphie gesucht
Fehler von Choose, da fehlt überall die Angabe des Parents. ;)
|
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:
|
Re: Beispiel für Polymorphie gesucht
Zitat:
Habe tatsächlich in der Eile die Vorfahren vergessen, schön, dass das Beispiel trotzdem verstanden wurde! |
Re: Beispiel für Polymorphie gesucht
@Choose: was hast du denn jetzt genmacht? :shock:
Delphi-Quellcode:
Was gibt denn das, wenn es fertig wird? :gruebel:
TGrapefruit(TCitrusFruit) = class
|
Re: Beispiel für Polymorphie gesucht
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:56 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