![]() |
Hund, Katze und das Klonen von Tieren (OOP-Problem)
Hallo,
ich habe hier grad ein Problem mit folgendem Code
Delphi-Quellcode:
Ausgabe:
type
TTier = class(TObject) Name: String; constructor Create;virtual; end; THund = class(TTier) constructor Create;override; end; TKatze = class(TTier) constructor Create;override; end; TKlonerei = class class function Clone(Tier: TTier): TTier; end; constructor TTier.Create; begin Name := 'Namenloses Viech'; end; constructor THund.Create; begin Name := 'Hund'; end; constructor TKatze.Create; begin Name := 'Katze'; end; class function TKlonerei.Clone(Tier: TTier): TTier; begin result := Tier.Create; end; var Hund: THund; Katze: TKatze; KlonTier: TTier; begin Hund := THund.Create; Katze := TKatze.Create; KlonTier := TKlonerei.Clone(Hund); Klontier.name := 'geklonter '+Klontier.name; writeln('Hund ist ein '+Hund.Name); writeln('Katze ist eine '+Katze.Name); writeln('KlonTier ist ein '+Klontier.Name); end.
Delphi-Quellcode:
gewünschte Ausgabe:
Hund ist ein geklonter Hund
Katze ist eine Katze KlonTier ist ein geklonter Hund
Delphi-Quellcode:
Hund ist ein Hund
Katze ist eine Katze KlonTier ist ein geklonter Hund D.h. die Clone-Prozedur in der Klonerei schlägt fehl, ich könnte natürlich jetzt folgendes schreiben:
Delphi-Quellcode:
aber wenn ich 1000 Tiere hab, dann ist das doch etwas mühsam. Wie geht das einfacher?
class function TKlonerei.Clone(Tier: TTier): TTier;
begin if Tier.class=THund then result := THund.Create; if Tier.class=TKatze then result := TKatze.Create; end; Gruß, Dennis |
Re: Hund, Katze und das Klonen von Tieren (OOP-Problem)
Wenn du nur eine neue Klasse eines Typs erstellen willst, geht das über Metaklassen:
Delphi-Quellcode:
Wenn du stattdessen eine Instanz wirklich kopieren willst, wird's schon etwas komplizierter. Als Pattern gibt es dazu Assign/AssignTo (leider kein Interface), allerdings ist das Duplizieren von Instanzen umstritten und in seltensten Fällen sinnvoll.
TTierKlasse = class of TTier;
[...] class function TKlonerei.Clone(Tier: TTier): TTier; begin // ohne Cast würde TObject.Create aufgerufen werden result := TTierKlasse(Tier.ClassType).Create; end; |
Re: Hund, Katze und das Klonen von Tieren (OOP-Problem)
ahh class of TTier, daran hab ich nicht gedacht danke! ja das wars schon, das klonen mit eigenschaften muss gar nicht sein, da würde ich auch eine assign-prozedur nehmen pro Tier, das target.attribut = source.attribut machen würd. Danke für die schnelle Antwort!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:59 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 by Thomas Breitkreuz