Интерфейс не работает если тип - реализующий его класс.

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Интерфейс не работает если тип - реализующий его класс.

Сообщение Deepthroat » 18.10.2008 20:02:11

Есть класс, унаследованный от TInterfacedObject. TInterfacedObject реализует интерфейс IUnknown, что позволяет автоматически вызывать деструктор, как только объект перестает использоваться (при выходе из области видимости).
Код: Выделить всё
TApplication = Class(TInterfacedObject)
...
end;


В программе пишу:
Код: Выделить всё
var
    app: TApplication;

begin
    app := TApplication.Create();
end.


При этом вот деструктор не вызывается, его надо вызывать вручную, т.е. app.Free(). Ситуация не меняется, если типом объекта я указываю TInterfacedObject. Но дальше я делаю так:
Код: Выделить всё
var
    app: IUnknown;

begin
    app := TApplication.Create();
end.


И что же? Деструктор вызывается самостоятельно, как только объект покидает область видимости.

Собственно, вопрос. Так и должно быть или это косяк? Почему если класс реализует интерфейс, то его поведение становится ожидаемым только если я указываю типом сам интерфейс? Получается, если тип - не интерфейс, то и реализации интерфейса не происходит?
Аватара пользователя
Deepthroat
постоялец
 
Сообщения: 144
Зарегистрирован: 06.09.2007 00:21:34
Откуда: Outer Heaven

Re: Интерфейс не работает если тип - реализующий его кла

Сообщение Odyssey » 18.10.2008 20:36:09

Так должно быть, это не косяк, и в Delphi это работает также как в FPC. Автоматические подсчет ссылок и вызов деструктора работают только для переменных интерфейсного типа. Подсчет ссылок на переменные типа "класс" не ведется, какие бы интерфейсы этот класс не реализовывал. Управление созданием/уничтожением классов ведется вручную или классами-контейнерами.
Deepthroat писал(а):Получается, если тип - не интерфейс, то и реализации интерфейса не происходит?

Реализация интерфейса классом позволяет присвоить переменной типа "интерфейс" значение типа "класс, реализующий данный интерфейс", т.е.
Код: Выделить всё
var
    app: IUnknown;
begin
    app := TApplication.Create();
end.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: Интерфейс не работает если тип - реализующий его кла

Сообщение Deepthroat » 18.10.2008 23:26:12

Спасибо за разъяснение.
Аватара пользователя
Deepthroat
постоялец
 
Сообщения: 144
Зарегистрирован: 06.09.2007 00:21:34
Откуда: Outer Heaven


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 23

Рейтинг@Mail.ru