Форум: "Прочее";
Текущий архив: 2006.05.14;
Скачать: [xml.tar.bz2];
ВнизИнтерфейсы без IID (GUID). Как работать в Delphi7? Найти похожие ветки
← →
iZEN © (2006-04-20 10:29) [0]Подскажите, что почитать на тему создания интерфейсов БЕЗ IID (GUID) в Delphi7.
Нужна подробная информация о внутренней механике работы объектов, реализующих такие интерфейсы (от порядка инстанцирования до взаимодействия).
(Это должно быть сильно отличается от реализации в Delphi3. Я правильно думаю?)
← →
iZEN © (2006-04-20 10:32) [1]Информация желательна в электронном виде.
← →
vuk © (2006-04-20 11:36) [2]Интерфейсы без IID делать можно. В реализации ничем не отличается от таких же интерфейсов, но с IID. Разница только в том, что их запрашивать нельзя. Получить же такой интерфейс можно только напрямую, приведением экземпляра класса через as.
← →
Харько © (2006-04-20 11:39) [3]А в чем радость интерфейса без IID? Suppoorts не используешь (что уже громадное неудобство)...
← →
iZEN © (2006-04-20 12:27) [4]vuk © (20.04.06 11:36) [2]
В Delphi 3 при приведении объектной ссылки к такому интерфейсу через оператор as вызывает ошибку, если я не ошибаюсь.
Ну и ещё общее свойство таких интерфейсов: их нельзя экспортировать во вне, но можно использовать только внутри приложения.
Соответственно, для классов, реализующих методы таких интерфейсов, можно не заботиться о "второй" линии жизни - линии на основе подсчёта ссылок, а полностью положиться на "ручное" управление временем жизни объекта (Free() вызывать, например, независимо от использования интерфейса).
Я прав?
← →
iZEN © (2006-04-20 12:30) [5]Может есть какие отличия и нюансы работы с такими интерфейсами Delphi7 от предыдущих версий (6.0 и 5.0, например)?
← →
Гаврила © (2006-04-20 12:30) [6]
> Соответственно, для классов, реализующих методы таких
> интерфейсов, можно не заботиться о "второй" линии
> жизни - линии на основе подсчёта ссылок, а полностью
> положиться на "ручное" управление временем жизни
> объекта (Free() вызывать, например, независимо от
>использования интерфейса).
> Я прав?
Ничто не мешает организовать такое же поведение (ручное управление временем жизни) и для интерфейсов с IID.
Так что по прежнему не видно смысла.
← →
Гаврила © (2006-04-20 12:32) [7]
> iZEN ©
Или ты просто их (гуиды) экономишь, боишься что кому-то не хватит? )))
← →
iZEN © (2006-04-20 12:34) [8]Гаврила © (20.04.06 12:32) [7],
чтобы не экспортировать и чтобы их не было видно из вне.
← →
iZEN © (2006-04-20 12:42) [9]vuk © (20.04.06 11:36) [2],
>Разница только в том, что их запрашивать нельзя.
В теории при каждом запросе интерфейса с IID происходит увеличение счётчика ссылок на объект, реализующий этот интерфейс. Но что происходит при использовании интерфейса без IID, если его запрашивать нельзя?
Я думаю, что счётчик ссылок в этом случае не меняется (ни инкрементируется, ни декрементируется), так как же поступает в этом случае компилятор: вставляет ли он автоматически код или нет? Могу ли я в этом случае управлять временем жизни объекта так, как если бы он был обычным объектом без интерфейса (вызывать Free() как у обычного объекта)?
← →
Гаврила © (2006-04-20 13:03) [10]
> iZEN ©
> и чтобы их не было видно из вне.
По умолчанию их извне и не видено. Чтобы их стало видно, надо предпринять определенные усилия.
> В теории при каждом запросе интерфейса с IID
> происходит увеличение счётчика ссылок на объект
Посмотри в модуле System, класс TinterfacedObject.
Посмотри как там реализованы методы _Addref и _Release.
Вот именно так, вручную, и реализовывается автоматическое управление временем жизни объекта.
И ничто не мешает тебе реализовать эти метды совершенно по другому, IID тут ни при чем.
Единственное, что будет обеспечено действительно автоматически, это вызовы _Addref и _Release.
ИХ вызывает компилятор ,а что при их вызове делать - считать ли ссылки, или не считать, решаешь уже ты
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2006.05.14;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.011 c