Sergei I. Gorelkin писал(а):Код в студию. Целиком, с объявлениями, созданием и вызовами...
Ура, эврика! Я нашёл! Спасибо Вам за моральную поддержку!
Дело в приведении типов. Когда в эту мясорубку попал мой интерфейс, он тут же был кастрирован. Попытаюсь описать ситуацию словами.
Есть базовый класс TAgeClass, от него порождён класс CSemanticBlock. Далее появляется интерфейс IAimInterface, и возникает новый класс CSB_Aim(CSemanticBlock, IAimInterface).
После чего я завожу переменную типа CSB_Aim и пытаюсь в неё загрузить ссылку на свежесозданный объект этого же типа.
Но!
Моя процедура загрузки работает с объектами типа TAgeClass. Всё, что она делает, это по имени объекта находит его ссылку и возвращает её.
Вот её объявление:
- Код: Выделить всё
LoadLinkName(name,AttrName : Domstring; var obj : TAgeClass);
Тут начинается интересное. Компилятор не пропускает присваивание объектов типа TAgeClass, или CSemanticBlock, в переменную, тип которой (CSB_Aim) порождён от интерфейса. И это правильно.
Но я запросто смог подставить мою интерфейсную переменную в мою процедуру, с помощью приведения типов, вот так:
- Код: Выделить всё
STORE.LoadLinkName(self.name, STORE_LINK_AIM, TAgeClass(self.aim));
Я так делал раньше, и всё работало. А когда добавил интерфейс в тип переменной aim, то выходит, что такое приведение типов "убивает" интерфейс. Что и приводит к падению.
Как из этого выйти, пока не придумал. Если есть интерес, могу состряпать демку, но думаю, и так всё понятно.
С уважением.