Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Заголовок статьи: Делегирование интерфейсов и подсчет ссылок в Delphi: различия XE2 и XE4

Delphi , Программа и Интерфейс , Интерфейс

В вопросе пользователя рассматривается ситуация, связанная с делегированием интерфейсов и подсчетом ссылок в среде разработки Delphi. Пользователь столкнулся со странным поведением при работе с интерфейсами и объектами, а именно с подсчетом ссылок при делегировании реализации интерфейсов.

Оригинальный вопрос

В коде, представленном пользователем, есть несколько интерфейсов IInterfaceZ и IInterfaceY, а также классы TObjectB, TObjectC и TObjectA, который реализует оба интерфейса. В методе TestInterfaces демонстрируется, как изменяется подсчет ссылок при делегировании реализации интерфейсов.

Пользователь заметил, что при первом вызове Supports увеличивается счетчик ссылок для объекта AA, который является делегирующим объектом, в то время как при делегировании интерфейса IInterfaceZ через объект FInterfaceB увеличивается счетчик ссылок для FInterfaceB. При попытке вызвать Supports для интерфейса ZZ, полученного через интерфейс YY, который делегирован объекту FObjectC, возникает ошибка, так как ZZ ссылается на TObjectB, а не на TObjectA, к которому делегирован интерфейс IInterfaceY.

Пользователь задает вопрос о том, является ли такое поведение частью дизайна или это ошибка. Также упоминается, что в XE2 поведение отличается.

Подробное описание

При работе с интерфейсами в Delphi важно понимать механизмы делегирования и подсчета ссылок. В зависимости от того, к какому типу свойства (интерфейс или класс) делегируется реализация интерфейса, подсчет ссылок будет вестись за внешним объектом или за объектом, реализующим делегируемый интерфейс.

В XE3 и более поздних версиях, если внешний объект делегирует реализацию интерфейса через свойство класса, то подсчет ссылок ведется за внешним объектом. Если же делегирование происходит через свойство интерфейса, то подсчет ссылок ведется за объектом, реализующим делегируемый интерфейс.

В XE2 и более ранних версиях, если объект поддерживает интерфейс IInterface, то подсчет ссылок ведется за внутренним объектом, а не за внешним.

Пример кода на Object Pascal (Delphi)

type
  IInterfaceZ = interface
  ...
  end;

  IInterfaceY = interface
  ...
  end;

  TObjectB = class(TInterfacedObject, IInterfaceZ)
  ...
  end;

  TObjectC = class
  ...
  end;

  TObjectA = class(TInterfacedObject, IInterfaceZ, IInterfaceY)
  private
    FInterfaceB: IInterfaceZ;
    FObjectC: TObjectC;
    function GetBB: IInterfaceZ;
  public
    ...
    property BB: IInterfaceZ read GetBB implements IInterfaceZ;
    property CC: TObjectC read FObjectC implements IInterfaceY;
  end;

...

procedure TestInterfaces;
var
  AA: TObjectA;
  YY: IInterfaceY;
  ZZ: IInterfaceZ;
  NewYY: IInterfaceY;
begin
  AA := TObjectA.Create;
  // Убедитесь, что Supports не уничтожит объект
  AA._AddRef;

  // Подсчет ссылок увеличивается для AA
  Supports(AA, IInterfaceY, YY);
  YY.DoNothing;

  // Подсчет ссылок увеличивается для FInterfaceB
  Supports(YY, IInterfaceZ, ZZ);
  ZZ.DoSomething;

  // Ошибка, так как ZZ ссылается на TObjectB, а не на делегирующий объект TObjectA
  Supports(ZZ, IInterfaceY, NewYY);
  NewYY.DoNothing; // Вызовет ошибку, так как NewYY = nil
end;

Заключение

Пользователь спрашивает, является ли такое поведение частью дизайна или это ошибка, и упоминает различия в поведении между XE2 и XE4. Ответ на вопрос заключается в том, что в XE3 и более поздних версиях дизайн был изменен, и теперь подсчет ссылок ведется за внешним объектом, если делегирование происходит через свойство класса, и за внутренним объектом, если через свойство интерфейса. В XE2 и более ранних версиях подсчет ссылок для объектов, поддерживающих IInterface, ведется за внутренним объектом.

Это изменение дизайна, вероятно, было сделано для улучшения согласованности и упрощения управления жизненным циклом объектов в Delphi.

Создано по материалам из источника по ссылке.

Ситуация связана с особенностями делегирования интерфейсов и подсчета ссылок в среде разработки Delphi, где наблюдается изменение поведения подсчета ссылок при делегировании реализации интерфейсов, что может вызывать вопросы о корректности дизайна.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Интерфейс ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 15:02:20/0.0052700042724609/1