![]() |
With MyObject as MyObject.ClassType Do
Delphi-Quellcode:
Wie kann ich sowas erreichen?
With MyObject as MyObject.ClassType Do
Es handelt sich um 2 Tdataset Nachfahren die über die selben Methoden verfügen. Ich kann nur eine davon umschreiben. Gibt es ein Interface das TTable implemtiert? Kann ich einfach casten auch wenn die verwendeten Methoden nicht in TDataset vorhanden sind? In Java könnte man sowas glaube ich über Aspekte oder Prototypen lösen gibt es sowas ähnliches in Delphi? |
Re: With MyObject as MyObject.ClassType Do
Zitat:
Gerade bei Datenbankzugriffskomponenten ist das Ergebnis der Kuddelmuddel den man jetzt hat... :wall: Was du hier machen kannst wäre Wrapper anzulegen, die ein Interface implementieren. Und dann eine Factory, wo du die Instanz des Datasets reinwirfst und eine Interface referenz des Wrappers zurückbekommst. |
Re: With MyObject as MyObject.ClassType Do
ICh wollte einfach vermeiden 2 identische Codeblöcke (ganz große) hin zu klatschen
für jedes der Tdatasets den selben, mit einer anderen
Delphi-Quellcode:
drumm herum.
With bla as Tblabla do
Wenn ich das über einen Wrapper mache der mir ein interface zurrück gibt müste ich in der Wrapper classe trotzdem jeden der Beiden TDataset Datentypen einzeln behandeln zumindest für Indexfieldnames, Tablename, Databasename, etc. Also keine so tolle Lösung dann lieber Copy&Paste |
Re: With MyObject as MyObject.ClassType Do
das was du vor hast geht nicht. Die with-Anweisung ist einfach nur für schreibfaule und wird zum Zeitpunkt des compilierens aufgelöst. Daher kannst du dort keinen dynamichen Datentyp nutzen. Ansonsten wäre es eine Interpretersprache.
|
Re: With MyObject as MyObject.ClassType Do
Zitat:
Wenn die Member, die du gleich behandeln willst wirklich gleich heißen und gleich deklariert sind,würde es schon reichen nur die im Interface aufzuführen. Das Interface würde dann implizit implementiert werden. Zitat:
Wie willst du sie denn sonst im Code gleich behandeln? Sie haben ja nicht die gleiche Hierarchie. |
Re: With MyObject as MyObject.ClassType Do
Ah, ja jetzt verstehe ich was du meinst.
Gut das hört sich nach einer Brauchbaren Lösung an. Ich entwerfe Ein Interfaface ITable und ich leite von TMyTable eine klasse ab die Ttable implementiert und sonst nichts tut ja ? Genau das slebe mache ich mit dem nnot good Old TTable so das ich quase beide Klassen über ihre Nachfahren mit dem Selben Interface versorgt habe. Kann ich dann einfach auf
Delphi-Quellcode:
casten?
with aDataset as ITable do
Könnte ich einen Vorfahren als einen Identischen Nachfahren Casten? Oder muss ich wirklich
Delphi-Quellcode:
machen?
adataset := TInterfacedTable.create(self);
|
Re: With MyObject as MyObject.ClassType Do
Zitat:
Zitat:
Generell gilt: Eine Instanz von TBlabla sollte man nicht einfach als TAbleitungVonBlabla benutzen, außer man weiß ganz genau was man da macht und vor allem warum man es macht. Wenn du beide (oder zukünftig mehr) Klassen ableiten und dein Interface implementieren kannst, und wenn du die Stellen, in denen die alten Klassen benutzt werden, durch die Ableitungen ersetzen kannst. Nunja, dann bräuchtest du keine Zauberei. Wenn das nicht geht wäre die einzige vernünftige Lösung einen Wrapper anzulegen, der das Interface implementiert und eine Factory, die aus einer Dataset-Instanz eine Referenz auf den Wrapper zurückgeben kann. Klingt alles viel schlimmer als es tatsächlich ist. ;) btw: Interfaces gehören IMHO genau wie Klassen zu den absoluten Grundlagen in Delphi. Du solltest dich also definitiv damit auseinandersetzen. |
Re: With MyObject as MyObject.ClassType Do
Ich habe mich immer wenn ich es mal brauchte damit auseinander Gesetzt, aber ich muss zu geben
das es eher ein Teil meines passiven Delphisprachschatzes ist... Der Begriff Factory sagt mir irgendwie nichts? Meinst du eine Klasse , Objekt oder Klassen Methode die im Prinzip Objekte erzeugt? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:56 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