AGB  ·  Datenschutz  ·  Impressum  







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

Klonen eines Interfaces

Ein Thema von Jasocul · begonnen am 22. Dez 2022 · letzter Beitrag vom 22. Dez 2022
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.535 Beiträge
 
Delphi 12 Athens
 
#1

AW: Klonen eines Interfaces

  Alt 22. Dez 2022, 12:27
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.
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.
Sehr interessant. Mich hatte das heute Morgen selbst gestört und daher heißt die Methode seit ein paar Stunden schon CopyFrom.

Hier mal ein Beispiel, was zeigt, dass Assign/Assign TO nichts automatisch macht, sondern du es machen mußt.
Delphi-Quellcode:
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;
Auch wenn das Beispiel nicht Ideal ist, denn das ELSE würde ich weglassen und Interhited immer ausgeführt werden sollte.
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)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.374 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Klonen eines Interfaces

  Alt 22. Dez 2022, 13:21
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?
Peter
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

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

AW: Klonen eines Interfaces

  Alt 22. Dez 2022, 13:29
denn das ELSE würde ich weglassen und Interhited immer ausgeführt werden sollte.
Das darf es aber nicht! Zumindest nicht immer. Die Implementierung von TPersistent.Assign leitet nämlich zu Source.AssignTo und das ist in der Regel nicht gewollt, sondern eher schädlich, wenn die aktuelle Klasse die Zuweisung im Assign selbst vornimmt.

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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  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 14:09 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