AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Klasse sich selbst in eine abgeleitete konvertieren

Klasse sich selbst in eine abgeleitete konvertieren

Ein Thema von Patrick · begonnen am 1. Mär 2010 · letzter Beitrag vom 1. Mär 2010
Antwort Antwort
Seite 1 von 2  1 2   
Patrick

Registriert seit: 15. Sep 2003
184 Beiträge
 
Delphi 2010 Professional
 
#1

Klasse sich selbst in eine abgeleitete konvertieren

  Alt 1. Mär 2010, 11:53
Hallo,

ich habe eine abstrakte Klasse, die im Konstruktor ermittelt um welche Konkrete Klasse es sich handelt. Kann ich das irgendwie bewerkstelligen, dass sie sich nun selbst in die konkrete Klasse konvertiert? Der konstruierenden Instanz sollte es eigentlich egal sein, welche konkrete Klasse erzeugt wird. Somit muss es diese selbst bewerkstelligen.

Lange Rede kurzer Sinn, ich will einfach eine Klasse sich selbst upgraden lassen:

z.B.
in einer Methode "Aufrüsten"
TTransporter wird zu TSchweineTransporter.
(TSchweineTransporter ist von TTransporter abgeleitet)
Genieße jede Minute deines Lebens, denn sie wird nicht wieder kommen.
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.604 Beiträge
 
#2

Re: Klasse sich selbst in eine abgeleitete konvertieren

  Alt 1. Mär 2010, 12:04
Das klingt ein bisschen Wirr.

Meinst Du vielleicht das sogenannte Factory-Pattern?

Ansonsten macht die Geschichte nicht viel Sinn: Die abstrakte Basisklasse kann den eigentlichen Typen gar nicht kennen.

Man stelle sich vor, die abstrakte Basisklasse liegt in einem Package, ein anderer Entwickler verwendet das Package und leitet von ihr ab - z.B. von TTransporter auf THühnerTransporter. Diese Klasse liegt dann in einem Package, das von Deinem Package abhängt. Deine Basisklasse wird daher nie alle seine Ableitungen kennen und dorthin casten können.

Das eigentliche Objekt ist im übrigen immer vom konkreten Typ. Das heisst wenn eine methode zwangsläufig einen Schweinetransporter braucht und nur einen Transporter erhält, dann muss sie sich selber drum kümmern zu gucken ob da Schweine reinpassen und ihn nötigenfalls zum Schweinetransporter runtercasten.
Sebastian Gingter
Phoenix - 不死鳥
Mein Blog: http://gingter.org
  Mit Zitat antworten Zitat
Patrick

Registriert seit: 15. Sep 2003
184 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Klasse sich selbst in eine abgeleitete konvertieren

  Alt 1. Mär 2010, 12:29
An das Factory-Pattern habe ich auch gedacht. Aber dann hätte ja die Factory auch über das Wissen verfügen müssen, wie Entschieden wird welche konkrete Klasse im Endeffekt erstellt werden muss.
Ich habe nun eine Methode gefunden, wie nur die eine abstrakte Klasse das wissen muss. Und in meinem Fall muss die abstrakte Klasse nicht alle Ableitungen kennen. Ich arbeite mit "GetClass(string)"

Delphi-Quellcode:
var Transporter : TTransporter;
Transporter := TTransporter.CreateInstanz('TSchweineTransporter');
Delphi-Quellcode:
class function TTransporter.CreateInstanz(EntryValue: string): TTransporter;
var tmp : TPersistentClass;
begin
  tmp := GetClass(EntryValue);
  if not Assigned(tmp) or tmp.InheritsFrom(TTransporter) then
  begin
    Result := nil;
    raise Exception.Create('Fehler!');
  end
  else
    Result := TTransporter(tmp);
end;
Genieße jede Minute deines Lebens, denn sie wird nicht wieder kommen.
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Klasse sich selbst in eine abgeleitete konvertieren

  Alt 1. Mär 2010, 13:08
Ich habe das Gefühl du möchtest Interfaces einsetzen.

Interfaces
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
Benutzerbild von guinnes
guinnes

Registriert seit: 28. Feb 2007
Ort: Bottrop
265 Beiträge
 
Delphi 5 Enterprise
 
#5

Re: Klasse sich selbst in eine abgeleitete konvertieren

  Alt 1. Mär 2010, 13:14
Was hältst du von Klassenreferenztypen :
Zitat:
Klassenreferenztypen werden auch als Metaklassen bezeichnet. Die Definition erfolgt folgendermaßen:

class of Typ

Typ ist ein beliebiger Klassentyp. Der Bezeichner Typ gibt einen Wert des Typs class of Typ an. Ist Typ1 ein Vorfahr von Typ
2, dann ist class of Typ2 zuweisungskompatibel zu class of Typ1. Ein Beispiel:

type TClass = class of TObject;

var AnyObj: TClass;

Die Variable AnyObj kann eine beliebige Klassenreferenz aufnehmen (ein Klassenreferenztyp darf nicht direkt in einer Variablendeklaration oder Parameterliste definiert werden). Klassenreferenzvariablen kann auch der Wert nil zugewiesen werden.
Das folgende Beispiel (Konstruktor der Klasse TCollection in der Unit Classes) zeigt, wie Klassenreferenztypen verwendet werden:

type TCollectionItemClass = class of TCollectionItem;

...
constructor Create(ItemClass: TCollectionItemClass);

Diese Deklaration besagt, daß beim Erstellen eines TCollection-Instanzobjekts der Name einer von TCollectionItem abgeleiteten Klasse an den Konstruktor übergeben werden muß.
Klassenreferenztypen sind hilfreich, wenn Sie eine Klassenmethode oder einen virtuellen Konstruktor in einer Klasse oder einem Objekt aufrufen wollen, dessen aktueller Typ zur Compilierzeit nicht bekannt ist.
Glückauf
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.734 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Klasse sich selbst in eine abgeleitete konvertieren

  Alt 1. Mär 2010, 13:32
Vielleicht kannst du Aggregation statt Vererbung benutzen? Also den Teil der Funktionalität, der "aufgerüstet" werden muss, in eine eigene, nicht von TTransporter abgeleitete Klassenhierachie auslagern, und eine passende Klasse instantiieren. TTransporter hätte also eine Referenz auf (z.B.) TTransporterVerhalten, die du z.B. auf eine Instanz von TSchweineTransporterVerhalten zeigen lässt.
Uli Gerhardt
  Mit Zitat antworten Zitat
Patrick

Registriert seit: 15. Sep 2003
184 Beiträge
 
Delphi 2010 Professional
 
#7

Re: Klasse sich selbst in eine abgeleitete konvertieren

  Alt 1. Mär 2010, 14:19
Klassenrefenzen benutze ich ja quasi schon.
Delphi-Quellcode:
tmp : TPersistentClass;
tmp := GetClass(EntryValue);
Nur wie bringe ich ihn den Konstruktor der Klasse TSchweineTransporter auszufühen und mir ein solches Objekt zu erzeugen?
wenn ich tmp.Create; ausführe, dann führt er nur den Konstruktor der Klasse TPersistent aus, was ja eigentlich auch logisch ist. Aber irgendwie ist doch da noch mein TSchweineTransporter mit drin, sonst würde ja tmp.InheritsFrom(TTransporter) nicht TRUE zurückgeben.

Oder führt da kein Weg am Factory-Pattern vorbei?

P.S.: Bitte nicht über die Logik von Transportern und Schweinetransportern nachdenken, das ist nur ein Pseudonym.
Genieße jede Minute deines Lebens, denn sie wird nicht wieder kommen.
  Mit Zitat antworten Zitat
Benutzerbild von guinnes
guinnes

Registriert seit: 28. Feb 2007
Ort: Bottrop
265 Beiträge
 
Delphi 5 Enterprise
 
#8

Re: Klasse sich selbst in eine abgeleitete konvertieren

  Alt 1. Mär 2010, 14:25
Delphi-Quellcode:
Type
  TTransporterClass = Class of TTransporter;

class function TTransporter.CreateInstanz(EntryValue : TTransporterClass): TTransporter;
begin
  Result := EntryValue.Create;
end;
Ungetestet, sollte aber gehen
Glückauf
  Mit Zitat antworten Zitat
Patrick

Registriert seit: 15. Sep 2003
184 Beiträge
 
Delphi 2010 Professional
 
#9

Re: Klasse sich selbst in eine abgeleitete konvertieren

  Alt 1. Mär 2010, 14:54
Negativ

Hierbei würde nur der Konstruktor von TTransporter ausgeführt werden, nicht aber der von TSchweineTransporter.

"Würde", weil ich "GetClass" verwende, was mir ein "TPersistent" zurück gibt. Müsste dann auch funktionieren, tut es aber leider nicht.

(Ableitung Schaut folgendermaßen aus: TObject -> TPersistent -> TTransporter -> TSchweineTransporter)
Genieße jede Minute deines Lebens, denn sie wird nicht wieder kommen.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.934 Beiträge
 
Delphi 12 Athens
 
#10

Re: Klasse sich selbst in eine abgeleitete konvertieren

  Alt 1. Mär 2010, 15:02
Wenn du den constructor der abgeleiteten Klasse aufrufen willst, musst du den von TTransporter virtual machen und den abgeleiteten override.
Uwe Raabe
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 11:32 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