Главная страница
    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.46 MB
Время: 0.046 c
15-1200926297
@!!ex
2008-01-21 17:38
2008.02.24
Помогите оплатить софтину через PayPal


2-1201596048
Михаил (Питер)
2008-01-29 11:40
2008.02.24
Интернет бот


2-1201681975
Andrej
2008-01-30 11:32
2008.02.24
TShellTreeView


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


9-1166547778
Kerk
2006-12-19 20:02
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский