Вниз
Скачать: CL | DM;

Подскажите   Найти похожие ветки 

← →
Бо   (2008-01-31 17:10) [0]

У меня в проекте есть несколько классов образованных таким образом, к примеру:
TFirstClass = class(TObject)
TSecondClass = class(TFirstClass)

TNextClass1 = class(TSecondClass)
TNextClass2 = class(TSecondClass)
..
TNextClass9 = class(TSecondClass)


Конечные классы (TNextClass1..TNextClass9) - отвечают за свой формат или скажем алгоритм, ну т.е. на выходе этих классов уникальные данные которые потом можно прочитать только этим же классом.

После обработки, я сохраняю данные в файл. Но мне нужно также открывать файл и отдавать содержимое необходимому классу.

Вопрос такой. Возможоли как-то (я не знаю, у меня нет идей) при сохранении записывать идентификатор класса, а потом, по идентификатору создавать автоматически нужный экземпляр класса и подгружать в него данные для чтения.

Я не говорю про банальную проверку:
case FileDataType of
1: ..TNextClass1.Create;
2: ..TNextClass2.Create;


Что подскажете?


← →
Jeer ©   (2008-01-31 17:15) [1]

Сделай не банальную проверку, но без проверки никак.


← →
Palladin ©   (2008-01-31 17:21) [2]


> Вопрос такой. Возможоли как-то (я не знаю, у меня нет идей)
> при сохранении записывать идентификатор класса, а потом,
> по идентификатору создавать автоматически нужный экземпляр
> класса и подгружать в него данные для чтения.

запросто...

создаем систему классов с виртуальным конструктором, и классом классов
создаем карту идентификаторов и классов
создаем ридер который по считаному идентификатору будем определять необходимый класс, и потом создавая его передавать ему на вход данные...


← →
Palladin ©   (2008-01-31 17:24) [3]

вообще говоря на этом приципе построена огромная подсистема VCL отвечающая за сериализацию форм и вообще объектов классов наследников TPersistent, я описал лишь очень кратко суть схемы


← →
Ins ©   (2008-01-31 17:37) [4]

Угу. Я бы тоже сделал виртуальный конструктор у TSecondClass, классовую ссылку (class of TSecondClass), а предком у них бы сделал бы не TObject, а TPersistent, чтобы классы можно было находить в неком реестре по имени с помощью GetClass или FindClass. Можно конечно и от TObject, но тогда придется делать свой механизм регистрации/поиска. Далее в файл записывать имя класса, потом читать его, и создавать экземпляр как-нибудь так:
type
 TSecondClassRef = class of TSecondClass;
....
var
 ClassRef: TSecondClassRef;
 NameOfClass: String;
 Inst: TSecondClass;
begin
 ...
 NameOfClass := ...
 ClassRef := FindClass(NameOfClass);
 Inst := ClassRef.Create;
 // тут работаем с экземпляром Inst. Inst - экземпляр того класса, имя которого было записано в файл
 ...
end;



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.018 c
8-1174828087
KOSik
2007-03-25 17:08
2008.02.24
Скругление угла


15-1200903906
Ega23
2008-01-21 11:25
2008.02.24
Об особенностях FireBird


11-1183818425
BMouradov
2007-07-07 18:27
2008.02.24
KolBZip2


2-1201633028
Inslave
2008-01-29 21:57
2008.02.24
Перемещаться как по Radiobutton ам


2-1201522928
BBCHa
2008-01-28 15:22
2008.02.24
Иконка и сервис




   Наверх