Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Виртуальное клонирование [D6]


Страницы:   1 2

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.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо