Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.24;
Скачать: 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 вся ветка

Текущий архив: 2008.02.24;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.021 c
2-1201595980
Dracula
2008-01-29 11:39
2008.02.24
Не дать уснуть компьютеру.


15-1201083737
Игорь Шевченко
2008-01-23 13:22
2008.02.24
Как добиться, чтобы русский текст письма выглядел по-русски...


2-1201555963
IntruderLab
2008-01-29 00:32
2008.02.24
TStringGrid


15-1201165540
РВА
2008-01-24 12:05
2008.02.24
Формирование xml


11-1184171451
MTsv DN
2007-07-11 20:30
2008.02.24
Новости http://www.kolnmck.ru/