Известно, что PascalABC.NET реализует ссылочную объектную модель. Как следствие, если X - объект, принадлежащий некоторому классу, то в результате присваивания var Y:=X произойдет копирование ссылки на X в объявленную переменную Y с автовыводом её класса, но при этом X и Y будут ссылаться на один и тот же объект. Это хорошо, потому что просто и наглядно позволяет написать P:=<выражение> и ни о чем не заботиться.
Но одновременно это бывает и плохо. Например, если как было указано выше X и Y - это ссылки на один объект, то изменение, сделанное в Х, будет отражаться и в Y, а также, наоборот. Чтобы избежать такой связки, приходится явно выполнять копирование объекта. Так, для массивов имеется функция Copy и мы пишем a:=Copy(b);
А теперь, собственно, проблема.
Пусть создается некий класс P
type P=class
x:array of real;
y:real;
constructor(px:array of real; py:real);
begin
x:=Copy(px);
y:=py
end;
constructor (n:integer);
begin
x:=new real[n];
y:=0.0
end;
end;
Я хочу в этом классе иметь возможность делать присваивание вида Q:=P так, чтобы происходило не копирование ссылки, а создавался новый объект, принимающий значения из старого.
Конечно, можно написать примерно такой код
begin
var a:=new P(Arr(1.0,2.0,3.0),-1.0);
var b:=new P(a.x,a.y);
end.
Но это даже при недостаточно несложной структуре класса Р выглядит достаточно неэлегантно.
Попытка перегрузить операцию присваивания у меня не получилась - видимо в справочной системе не хватает какого-то сакрального знания, либо оно запрятано)) Т.е. сам код перегрузки я написал, но после этого начались проблемы с конструктором, который также начал пытаться использовать эту перегрузку.
type P=class
x:array of real;
y:real;
constructor(px:array of real; py:real);
begin
x:=Copy(px);
y:=py
end;
constructor (n:integer);
begin
x:=new real[n];
y:=0.0
end;
class procedure operator :=(var pp:P; value:P);
begin
pp.x:=Copy(value.x);
pp.y:=Value.y;
end;
end;
begin
var a:=new P(Arr(1.0,2.0,3.0),-1.0);
var b:=new P(a.x,a.y);
end.
Компилятор ругается на строку var a:=new P(Arr(1.0,2.0,3.0),-1.0);
- пишет “Несколько подпрограмм могут быть вызваны”.
Хотелось бы увидеть решение, если оно возможно.