Autor Beitrag
FinnO
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: Fr 01.10.10 15:57 
Moin,

habe mich heute im Informatikunterricht erstmals mit einem etwas verrückten Problem auseinandersetzen müssen:

Folgende Situation - wir haben eine wunderschöne pupseinfache Basisklasse, die ich hier unten mal eben aufgeschrieben habe. Ich würde jetzt recht gerne eine Kopie eines Objekts einer Klasse basteln.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
type
  TZahl = Class
  private
    FValue : Integer;
  public
    property Value : Integer read FValue write FValue;
    
    constructor create(AValue : Integer); overload;

    procedure Display(ed : TEdit); 
  end;

implementation

constructor TZahl.Create(AValue : Integer); 
begin
  inherited create;
  FValue := AValue;
end;

procedure TZahl.Display(ed : TEdit); 
begin
  ed.Text := IntToStr(FValue);
end;
end.


bekannt ist ja, dass der Compiler im Hintergrund gerne mal herumpointert:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var
  a, b : TZahl;
begin
  a := TZahl.Create(25); 
  b := a; 
  b.Value := 30;

  a.Display(edA);
  b.Display(edB);
end;


Die Folge ist: in beiden Edits steht 30. Das liegt daran, dass im Hintergrund still und heimlich das andere Objekt referenziert wird. Wie kann ich jetzt eine Klasse sinnvoll kopieren, das heißt, ein Objekt eins zu eins an anderer Stelle einsetzen, dann aber alleinstehend bearbeiten, ohne erst einen anderen überladenen Constructor oder wasweißich selbst zu basteln?

LG
Lemmy
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 792
Erhaltene Danke: 49

Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
BeitragVerfasst: Fr 01.10.10 16:08 
Hi,

ganz einfach: eine neue Instanz anlegen und die relevanten Daten des Objektes kopieren. Die VCL bietet dafür die Methoden Assign bzw. AssingTo an. Wenn Du diese einsetzten willst, überschreibst Du einfach die AssignTo bei der entsprechenden Klasse und machst dort die Zuweisung.

Grüße