Назначение указателей интерфейса в объявлении класса Delphi 6? - PullRequest
10 голосов
/ 14 ноября 2011

Несмотря на годы программирования на Delphi, я просто столкнулся со стилем объявления класса, которого никогда не видел для класса, поддерживающего IUnknown:

TBCUnknown = class(TBCBaseObject, IUnKnown)
private
  FRefCount: integer;
  FOwner   : Pointer;
protected
  function IUnknown.QueryInterface = NonDelegatingQueryInterface;
  function IUnknown._AddRef = NonDelegatingAddRef;
  function IUnknown._Release = NonDelegatingRelease;
  function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
...

Как видите, присваивание методов класса методам интерфейса IUnknownделается прямо в объявлении класса.Это выглядит очень странно для меня, особенно потому, что я не понимаю, как можно назначить методы IUnknown до вызова конструктора.Является ли это своего рода ярлыком времени компиляции для выполнения назначений между методами класса и указателями на интерфейс для интерфейса, который принимает класс, которые позже разрешаются во время выполнения?Если бы кто-то мог предоставить небольшую информацию о том, как это работает и что идиома Delphi поддерживает такую ​​конструкцию, я бы хотел знать.

Ответы [ 2 ]

12 голосов
/ 14 ноября 2011

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

В вашем примере объявление означает, что IUnknown._AddRef реализуется TBCUnknown.NonDelegatingAddRef и IUnknown._Release TBCUnknown.NonDelegatingRelease.

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

3 голосов
/ 14 ноября 2011

Это то, что известно как пункт разрешения метода . Цитировать из документации :

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...