Originally Posted by
SamWitse
De methods Assign zorgen voor een deep copy van de objecten.
Waar gaat het mis?
In procedure TMaster.Assign(AMaster: TMaster);
wordt de figuur gecopiëerd dmv
FFiguur.Assign(AMaster.FFiguur);
maar die voert de Assign uit van TFiguur, en NIET de Assign van TCirkel.
Eigenlijk geef je het zelf al aan. Als je Assign(FFiguur) doet dan worden alleen de properties van FFiguur gekopieerd (naar een bestaand object). En dat is dus alleen de kleur Geel (die wel netjes mee gaat). Straal wordt dan dus niet gekopieerd. (over het bestaande object kom ik hieronder terug) Je kunt wel een pointer naar je figuur-object meegeven maar dat is denk ik niet wat je wilt:
Delphi Code:
procedure TMaster.Assign(AMaster: TMaster);
begin
FFiguur := AMaster.FFiguur;
// FFiguur.Assign(AMaster.FFiguur);
FWaarde := AMaster.FWaarde
end;
Let op: Je kopieert dan niet alles van AMaster.FFiguur maar je geeft de ALLEEN de pointer door aan TMaster.
Jouw probleem is dat je een object binnen een object hebt. Die kun je niet zonder meer met alleen assigns kopiëren. Ik zie bijvoorbeeld wel dat je JouwSlave:= TSlave.Create; doet maar nergens maar je ook een KOPIE van je TFiguur aan (alleen een assign doet dat n.l. niet). Ik hoop dat ik het een beetje duidelijk uitleg.
Als je echt een kopie van je TFiguur wilt hebben binnen je nieuwe JouwSlave-object dan zul je de TFiguur ook moeten "clonen".
Zie: https://stackoverflow.com/questions/...-delphi-object
In jouw geval kun je dan zoiets doen (er zullen misschien ook andere methodes zijn maar daar ben ik niet ingedoken):
Delphi Code:
type
TFiguur = class
private
{ private declarations }
FKleur: string;
public
{ public declarations }
procedure Assign(AFiguur: TFiguur);
property Kleur: string read FKleur write FKleur;
function Clone: TFiguur; virtual;
end;
TCirkel = class(TFiguur)
private
{ private declarations }
FStraal: Integer;
public
{ public declarations }
procedure Assign(ACirkel: TCirkel);
property Straal: Integer read FStraal write FStraal;
function Clone: TFiguur; override;
end;
TVierkant = class(TFiguur)
private
{ private declarations }
FZijde: string;
public
{ public declarations }
procedure Assign(AVierkant: TVierkant);
property Zijde: string read FZijde write FZijde;
function Clone: TFiguur; override;
end;
implementation
procedure TFiguur.Assign(AFiguur: TFiguur);
begin
FKleur := AFiguur.Kleur
end;
function TFiguur.Clone: TFiguur;
begin
Result := TFiguur.Create;
TFiguur(Result).Assign(Self);
end;
{ TCirkel }
procedure TCirkel.Assign(ACirkel: TCirkel);
begin
inherited Assign(TFiguur(ACirkel)); { Om de Kleur op te vullen }
FStraal := ACirkel.FStraal;
end;
function TCirkel.Clone: TFiguur;
begin
Result := TCirkel.Create;
TCirkel(Result).Assign(Self);
end;
{ TVierkant }
procedure TVierkant.Assign(AVierkant: TVierkant);
begin
inherited Assign(TFiguur(AVierkant)); { Om de Kleur op te vullen }
FZijde := AVierkant.FZijde
end;
function TVierkant.Clone: TFiguur;
begin
Result := TVierkant.Create;
TVierkant(Result).Assign(Self);
end;
Dan heb je voor alles een .Clone functie (die inherited en overridden is zodat ook het juiste object gekopieerd wordt).
In TMaster doe je dan dit:
Delphi Code:
procedure TMaster.Assign(AMaster: TMaster);
begin
FFiguur := AMaster.FFiguur.Clone;
FWaarde := AMaster.FWaarde
end;
En dan zou het moeten werkten. De AMaster.FFiguur.Clone roept de uiteindelijke inherited "juiste" .Clone aan zodat de correcte figuur aangemaakt wordt en toegekend wordt.
Bookmarks