AGB  ·  Datenschutz  ·  Impressum  







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

Zu unbekanntem Klassenderivat casten?

Ein Thema von blackdrake · begonnen am 12. Mär 2009 · letzter Beitrag vom 17. Mär 2009
Antwort Antwort
blackdrake

Registriert seit: 21. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#1

Re: Zu unbekanntem Klassenderivat casten?

  Alt 13. Mär 2009, 08:42
Hallo.

Vielen Dank für eure zahlreichen Antworten!

Sowohl die Meta-Klassen als auch die virtuell-abstrakten Clone-Methoden haben funktioniert:

Delphi-Quellcode:
type
  TBasis = class(TObject)
    Test: string;
    constructor Create;
    function Clone: TBasis; virtual; abstract;
  end;

  TAbleitung = class(TBasis)
    Test: string;
    constructor Create;
    function Clone: TBasis; override;
  end;

  TBaseClassType = class of TBasis;

{ TForm1 }

procedure TForm1.CloneVariant(Sender: TObject);
var
  Original, Kopie: TBasis;
  TempType: TBaseClassType;
begin
  Original:= TAbleitung.Create; // Dynamisch ermittelt, Derivat unbekannt
  Original.Test := 'Hubbi';

  TempType := TBaseClassType(Original.ClassType);

  Kopie := TBasis(TempType.Create);
  Kopie.Test := 'Flubby';

  showmessage(Original.Test);
  showmessage(Original.ClassName);
  showmessage(Kopie.Test);
  showmessage(Kopie.ClassName);

  // Ausgegeben:
  // Create Ableitung; Create Basis; Create Basis;
  // Hubbi; TAbleitung; Flubby; TAbleitung (OK)
end;

procedure TForm1.MetaClassVariant(Sender: TObject);
var
  Original, Kopie: TBasis;
begin
  Original := TAbleitung.Create; // Dynamisch ermittelt, Derivat unbekannt
  Original.Test := 'Hubbi';

  Kopie := Original.Clone;
  Kopie.Test := 'Flubby';

  showmessage(Original.Test);
  showmessage(Original.ClassName);
  showmessage(Kopie.Test);
  showmessage(Kopie.ClassName);

  // Ausgegeben:
  // Create Ableitung; Create Basis; Create Ableitung; Create Basis;
  // Hubbi; TAbleitung; Flubby; TAbleitung (OK)
end;

{ TBasis }

constructor TBasis.Create;
begin
  showmessage('Create Basis');
  inherited;
end;

{ TAbleitung }

constructor TAbleitung.Create;
begin
  showmessage('Create Ableitung');
  inherited;
end;

function TAbleitung.Clone: TBasis;
begin
  result := TAbleitung.Create;
  result.Test := Test;
end;
Ich denke, dass ich die Metaklassen verwenden werde, da dadurch mein Code aufgrund der nicht zu implementierenden Clone-Methoden etwas schlanker bleibt.

Ist das jetzt alles OK, was ich hier gemacht habe?

@stoxx: Mein Code funktioniert scheinbar, obwohl ich nicht folgende Hinweise beachtet habe:

Zitat:
// constructor create von TBASIS muss virtual deklariert sein (oder virutal; abstract)
// constructor create von TAbleitungA muss als override; deklariert werden
Wieso ist das so? Ist mein Code damit noch nicht in Ordnung und sollte ich etwas ändern?

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat
Antwort Antwort


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 04:51 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