![]() |
Objekt Casting
Hallo...
Gegeben: Klasse1 TTest1 Klasse2 TTest2 procedure Save(T1: TTest1); overload; procedure Save(T2: TTest2); overload; ObjectList mit List[0] = Object von TTest1 und List[1] = Object von TTest2 sooo... jetzt war ich der geistesgestörten Meinung wenn ich... Save(List[Laufvariable]); ...ausführe die entsprechende Save Procedure aufgerufen wird. Inzwischen ist mir klar das das nicht geht. Wie kriege ich das Objekt im Save Aufruf gescheit gecastet ? (ohne if Orgien) Diverse Versuche über ClassType schlugen fehl... Danke für Info´s |
AW: Objekt Casting
Verwende statt overload besser override und mache dir den Unterschied klar
Aaalso: Verfrachte die Save() Prozedur in einen gemeinsamen Vorfahren, dann kannst du ihn aufrufen. Alternativ kannst du auch ein kleines Interface deklarieren, das beide Klassen implementieren. Dann kannst du zu dem Interface casten und fertisch. (Falls vererbung bereits benutzt wird) Falls du eine eigenständige Prozedur haben willst, weiß ich leider keinen Ausweg :oops: |
AW: Objekt Casting
Danke für die Info´s...
die Proceduren sind im DBFramework. Diesem übergebe ich das Objekt und fertsch. Gemeinsamer Vorfahr wäre TObject... :gruebel: Da die Objekte in einer TObjectList stehen sind die Typen ja nicht eindeutig. Gibt es eine Cast Möglichkeit ohne
Delphi-Quellcode:
?
if List[I].ClassType = TIrgendwas then Save(TIrgendwas(List[I]));
PS: wir reden über mehr als 20 verschiedene Objekttypen. Ich wollte mir das mit dem Überladen vereinfachen. Prinzipiell geht das auch wenn der Objekttyp eindeutig ist. Nachtrag: Du meinst eine Save Prozedur der ich Tobject übergebe und im DBFramework über if´s die entsprechenden Objekttypen aufdrösle ? |
AW: Objekt Casting
Hier diskutiere ich das Problem:
![]() mfg Christian |
AW: Objekt Casting
Danke erstmal...
Aber heute nicht mehr... Da fehlt´s an Konzentration :zwinker: Nebenbei überlege ich ob die ObjectList Variante so prickelnd ist. Oder einfach wirklich manuell casten und Ruhe ist... |
AW: Objekt Casting
Zitat:
![]() |
AW: Objekt Casting
Ein Konzept:
Delphi-Quellcode:
unit UnitFramework;
type TWirter = class() function Accept(AObject: TObject): Boolean; virtual; abstract; procedure Write(AObject); virtual; abstract; end; TReader = class() function Accept(AObject: TObject): Boolean; virtual; abstract; procedure Read(AObject); virtual; abstract; end; TFrameWork = class() private FWriterList: TObjectList; FReaderList: TObjectList; public procedure RegisterWriter(AWriter: TWriter); procedure RegisterReader(AReader: TReader); procedure Read(AObject: TObject); procedure Write(AObject: TObject); end; var MyFrameWork: TFrameWork; implementation procedure TFrameWork.RegisterWriter(AWriter: TWriter); begin FWriterList.Add(AWriter); end; procedure TFrameWork.RegisterReader(AReader: TReader); begin FReaderList.Add(AReader); end; procedure TFrameWork.Read(AObject: TObject); begin for Reader in FReadList do if Reader.Accept(AObject) then begin Reader.Read(AObect); Exit; end; end; procedure TFrameWork.Write(AObject: TObject); begin for Writer in FWriterList do if Writer.Accept(AObject) then begin Writer.Write(AObect); Exit; end; end;
Delphi-Quellcode:
unit UnitMyObject;
type TMyObject = class() end;
Delphi-Quellcode:
unit UnitMyObjectReadWrite;
uses UnitFramework, UnitMyObject; type TReader_MyObject = class(TReader) function Accept(AObject: TObject): Boolean; override; procedure Read(AObject); override; end; implementation function TReader_MyObject.Accept(AObject: TObject): Boolean; begin Result := AObject is TMyObject; end; procedure TReader_MyObject.Read(AObject); begin with AObject as TMyObject do begin {...} end; end; initialization MyFrameWork.RegisterReader(TReader_MyObject.Create); end. |
AW: Objekt Casting
Guten Morgen...
Danke an alle die sich Mühe gemacht haben. Ich habe mich für den Weg des manuellen Castings ala
Delphi-Quellcode:
entschieden. Sind ja nur 20 Quelltextzeilen mehr. Quasi eine je Objekttyp.
if aObject.ClassType = TIrgendwas then Save(TIrgendwas(aObject));
Ich übergebe dem DBFramework ein TObject und dieses dröselt das nach Objekttypen auf und ruft die entsprechende überladene Prozedur auf. Fand ich am einfachsten umzusetzen. Danke an alle... :hi: @Uwe: dein Link bzw. die weiteren Seiten lassen sich nicht öffnen (sporadisch) Database Error Stand: 10:43 |
AW: Objekt Casting
Zitat:
Danke für die Info :thumb: |
AW: Objekt Casting
...was ist schon perfekt 8-)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:27 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