Форум: "Начинающим";
Текущий архив: 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