Delphi Prism: это глубокая или мелкая копия? - PullRequest
0 голосов
/ 30 декабря 2011

Взгляните на следующий код:

method TMakerRect.Clone: TMakerObject;
var
  newRect:TMakerRect;
begin
  newRect := new TMakerRect(bounds,myForm);
  newRect.Assign(Self);
  newRect.theBrushStyle := Self.theBrushStyle;
  Result := newRect;
end;

method TMakerGraphic.Assign(obj:TMakerObject);
begin
  inherited Assign(obj);
  if obj is TMakerGraphic then
  begin
       thePen:=TmakerGraphic(obj).thePen;
       FillColor:=TMakerGraphic(obj).fillColor;
       dynamics:=TmakerGraphic(obj).dynamics;
  end;
end;

Я думаю, что именно так вы и сделаете клонирование объекта в глубокой копии. Если это правда, эти объекты должны действовать так, как если бы они были отдельными объектами, но это не так. Каждый раз, когда я изменяю, например, ширину ручки, она также меняет ширину ручки исходного объекта. Пожалуйста, помогите.

Заранее спасибо.

1 Ответ

1 голос
/ 30 декабря 2011

Это мелкий клон;thePen не клонируется, но совместно используется двумя экземплярами.

Вместо

newRect.Assign(Self);

вы должны клонировать каждое отдельное свойство, что-то вроде этого (примечание: псевдокод)

newRect.thePen := self.thePen.Clone();
etc...
...