Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.02.24;
Скачать: [xml.tar.bz2];

Вниз

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

 
Бо   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.046 c
2-1201801065
Artem
2008-01-31 20:37
2008.02.24
Сохранить строку в ресурсе


15-1200760437
cartman315
2008-01-19 19:33
2008.02.24
Delphi и flash.ocx


8-1174223850
Ricks
2007-03-18 16:17
2008.02.24
Потестите Media Player


15-1200740613
Dmitry S
2008-01-19 14:03
2008.02.24
Pixel Art


6-1180084614
Dmitry_177
2007-05-25 13:16
2008.02.24
Продолжительное или разовое соединение





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский