Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Hund, Katze und das Klonen von Tieren (OOP-Problem) (https://www.delphipraxis.net/112120-hund-katze-und-das-klonen-von-tieren-oop-problem.html)

cydo 15. Apr 2008 13:53


Hund, Katze und das Klonen von Tieren (OOP-Problem)
 
Hallo,

ich habe hier grad ein Problem mit folgendem Code

Delphi-Quellcode:
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.
Ausgabe:
Delphi-Quellcode:
Hund ist ein geklonter Hund
Katze ist eine Katze
KlonTier ist ein geklonter Hund
gewünschte Ausgabe:
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:
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;
aber wenn ich 1000 Tiere hab, dann ist das doch etwas mühsam. Wie geht das einfacher?

Gruß,
Dennis

Khabarakh 15. Apr 2008 14:04

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:
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;
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.

cydo 15. Apr 2008 14:11

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 02:47 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