![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Виртуальное клонирование [D6]
JLes © (2005-10-31 16:33:00)Глубокоуважаемый All!
Есть иерархия классов, в основе которой лежит некоторый класс TMyObject. Есть также TMyList, в котором лежат объекты классов из вышеуказанной иерархии, доступные через Items[idx]: TMyObject. В TMyList имеется также метод, позволяющий копировать часть одного списка в другой.
Вопрос - как эффективнее всего (как с точки зрения выполнения, так и с точки зрения программирования и сопровождения) организовать создание копий объектов TMyObject (и потомков)?
reonid (2005-10-31 17:33:00) [21]TMyBaseObject = class
...
function Clone: TMyBaseObject; virtual;
end;
JLes (2005-10-31 17:24:00) [22]
> Написать виртуальный метод Assign, в котором присваивать
> значения свойств исходного объекта вновь созданному.
Гм. Представим:
procedure TMyList.CopyFragment(idxBegin, idxEnd: integer; Source: TMyList);
var
src, tmp: TMyObject;
i: integer;
begin
for i:=idxBegin to idxEnd do
begin
src:=Source.Items[i];
tmp:=??? // создаем объект класса, совпадающего с классом src
tmp.Assign(src); // вариант 1 будет работать, если правильно сработает
// предыдущая строчка. Иначе будет неизвестно, Assign какого класса вызывать.
// однако src будет правильного класса
src.AssignTo(tmp); // вариант2 - будет вызван Assign правильного класса,
// однако это все равно будет работать только в том случае, если tmp
// будет того же класса, что и src.
end;
end;
Так что все упирается в создание объекта нужного класса, когда носителем информации о классе является сам копируемый объект. Решение в лоб:
if src is TMyObject2 then
tmp:=TMyObject2.Create
else if src is TMyObject3 then
tmp:=TMyObject3.Create
...
Assign сам по себе, без корректного создания копии - не решение.
Игорь Шевченко (2005-10-31 16:36:00) [23]
> Вопрос - как эффективнее всего (как с точки зрения выполнения,
> так и с точки зрения программирования и сопровождения)
> организовать создание копий объектов TMyObject (и потомков)?
>
Написать виртуальный метод Assign, в котором присваивать значения свойств исходного объекта вновь созданному.
Образцов такого рода действий много в исходных кодах VCL.