![]() |
AW: Klonen eines Interfaces
Zitat:
Zitat:
EDIT: Ich bin nicht gescheitert, aber da die Instanzen vom Typ IMyInt sind, hätte ich hart auf TMyClass casten müssen, damit das assign funktioniert. Da ich kein Freund von solchen Casts bin, habe ich nach einer anderen Lösung gesucht. Wenn es einen Weg ohne den Cast gibt, bräuchte ich einen Tipp. |
AW: Klonen eines Interfaces
Ja, die vordefinierten Assign nehmen nur persistente Klassen an.
seit paar Jahren kann man in Delphi Interfaces (in denen ein Delphi-Objekt steckt) ganz einfach mit AS in ein Objekt casten. Wenn alles Kopierbare aber als Property/Funktionen lesbar und schreibbar ist, kannst du auch einfach diese Property/Funktionen des Interfaces zum Kopieren der Eigenschaften benutzen und mußt nicht casten. Wie gesagt, DU mußt die Eigenschafften einzeln übertragen, auch wenn man es bei persistenten Klassen auch anders lösen könnte. Diese persistenten Klassen haben ja Funktionen, um ihren Inhalt/Zustand zu serialisieren/speichern, also quasi die eine Instanz in einen Stream speichern und die andere Instanz aus dem Stream zu laden. Aber da du ja nicht von TPersistent oder TComponent geerbt hast, mußt du eh diese Methode selber komplett neu einbauen und kannst dort auch so Einiges ändern, wie eben z.B. den Parameter als Interface. Im Prinzip ist es egal, wie du deine Kopieren-Methode nennst, aber es macht sich besser, wenn man Methoden mit einheitlichem Verhalten auch einheitlich benennt. Darum Assign, aber auch Clone wird da oft als Name genommen. Wobei Assign die Daten in die eigene Instanz übernimmt, AssignTo an die andere Instanz übergibt und Clone erstellt selber die neue Instanz, überträgt die Eigenschaften und gibt es als Result zurück. |
AW: Klonen eines Interfaces
Vielen Dank für deine zusätzlichen Infos.
Eine Umstellung auf TPersistent wäre in der aktuellen Phase sicher kein Problem. Aber im Moment scheint es mir so, als hätte ich mit meiner Variante den passenden Weg gefunden. Trotzdem werde ich weiterhin ein Auge darauf haben, ob nicht doch noch eine Anpassung notwendig wird. Zitat:
|
AW: Klonen eines Interfaces
Zitat:
Hier mal ein Beispiel, was zeigt, dass Assign/Assign TO nichts automatisch macht, sondern du es machen mußt.
Delphi-Quellcode:
Auch wenn das Beispiel nicht Ideal ist, denn das ELSE würde ich weglassen und Interhited immer ausgeführt werden sollte.
procedure TEditMargins.Assign(Source: TPersistent);
begin if Source is TEditMargins then begin FLeft := TEditMargins(Source).Left; FRight := TEditMargins(Source).Right; FAuto := TEditMargins(Source).Auto; end else inherited; end; Denn jede Klasse kopiert die eigenen Eigenschaften, welche bei sich eingebaut wurden, und die Vorfahren kopieren ihr Zeugs usw. Wobei ich das Inherited als Erstes aufrühre, also erst das Zeugs der Vorfahren und dann das Eigene, genauso wie man es auch im Create macht. (eigenes Erstellen und Laden zuletzt und beim Entladen und Freigeben zuerst) |
AW: Klonen eines Interfaces
Inherited würde ich beim Assign auch als erstes machen. Anderenfalls bestünde die Gefahr, dass manuell gesetzte Werte durch ein folgendes inherited wieder überschrieben würden.
Allerdings bin ich jetzt ein wenig verwirrt. Du schreibst, dass Assign nichts automatisch macht und man die Werte selbst übernehmen muss. Andererseits kopiert jede Klasse die eigenen Eigenschaften. Wenn ich also in deinem Beispiel ein TEditMargins als Parameter übergebe, müssten doch alle eigenen Eigenschaften übernommen werden, also auch die, die im Beispiel manuell zugewiesen werden, oder? |
AW: Klonen eines Interfaces
Zitat:
Im Assign das inherited aufzurufen darf also nur dann passieren, wenn nicht direkt von TPersistent abgeleitet wurde und eine dazwischen liegende Klasse den Aufruf von TPersistent.Assign verhindert. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:49 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