Назначение указателей интерфейса в декларации класса Delphi 6?

Несмотря на годы программирования 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 поддерживает такую ​​конструкцию, которую я хотел бы знать.

Ответ 1

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

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

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

Ответ 2

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

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