AGB  ·  Datenschutz  ·  Impressum  







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

Richtige Objekt-Kopie? Aber wie?

Ein Thema von Kedariodakon · begonnen am 13. Feb 2007 · letzter Beitrag vom 15. Feb 2007
Antwort Antwort
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.749 Beiträge
 
Delphi 2007 Professional
 
#1

Re: Richtige Objekt-Kopie? Aber wie?

  Alt 14. Feb 2007, 18:42
Bei nachfolgendem Testprojekt passiert bei mir kein Baba. (Wenn wir bei Baba an das Gleiche denken. )

CloneAssignTest.dpr:
Delphi-Quellcode:
program CloneAssignTest;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  CloneAssign in 'CloneAssign.pas';

var
  b1, b2: TBasis;

begin
  b1 := TAbgeleitetS.Create('StringDing', 'Blah');
  try
    b2 := b1.Clone;
    Writeln(b1.ToString);
    Writeln(b2.ToString);
  finally
    b1.Free;
  end;

  b1 := TAbgeleitetI.Create('IntDing', 4711);
  try
    b2 := b1.Clone;
    Writeln(b1.ToString);
    Writeln(b2.ToString);
  finally
    b1.Free;
  end;

  Readln;
end.
CloneAssign.pas:
Delphi-Quellcode:
unit CloneAssign;

interface

type
  TBasis = class
  strict private
    FName: string;
  public
    constructor Create(const AName: string);
    function Clone: TBasis;
    procedure Assign(Source: TBasis); virtual;
    function ToString: string; virtual;
  end;

  TAbgeleitetS = class(TBasis)
  strict private
    FText: string;
  public
    constructor Create(const AName, AText: string);
    procedure Assign(Source: TBasis); override;
    function ToString: string; override;
  end;

  TAbgeleitetI = class(TBasis)
  strict private
    FCount: Integer;
  public
    constructor Create(const AName: string; ACount: Integer);
    procedure Assign(Source: TBasis); override;
    function ToString: string; override;
  end;

implementation

uses
  SysUtils;
  
{ TBasis }

constructor TBasis.Create(const AName: string);
begin
  inherited Create;
  FName := AName;
end;

function TBasis.Clone: TBasis;
begin
  // Da der Konstruktor über ClassType aufgerufen wird (und nicht direkt
  // TBasis.CreateRaw), wird eine Instanz des richtigen Typs erzeugt:
  Result := TBasis(ClassType.Create);
  Assert(Result.ClassType = ClassType);
  Result.Assign(Self);
end;

procedure TBasis.Assign(Source: TBasis);
begin
  FName := Source.FName;
end;

function TBasis.ToString: string;
begin
  Result := FName + ': ' + ClassName;
end;

{ TAbgeleitetS }

constructor TAbgeleitetS.Create(const AName, AText: string);
begin
  inherited Create(AName);
  FText := AText;
end;

procedure TAbgeleitetS.Assign(Source: TBasis);
begin
  inherited Assign(Source);
  FText := TAbgeleitetS(Source).FText;
end;

function TAbgeleitetS.ToString: string;
begin
  Result := inherited ToString + sLineBreak + ' Text = "' + FText + '"';
end;

{ TAbgeleitetI }

constructor TAbgeleitetI.Create(const AName: string; ACount: Integer);
begin
  inherited Create(AName);
  FCount := ACount;
end;

procedure TAbgeleitetI.Assign(Source: TBasis);
begin
  inherited Assign(Source);
  FCount := TAbgeleitetI(Source).FCount;
end;

function TAbgeleitetI.ToString: string;
begin
  Result := inherited ToString + sLineBreak + ' Count = ' + IntToStr(FCount);
end;

end.
Haut das bei dir auch hin?
Uli Gerhardt
  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 06:21 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