Назначение указателей интерфейса в декларации класса 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
Это то, что известно как пункт разрешения метода. Процитировать :
Вы можете переопределить сопоставления по умолчанию по умолчанию, включив предложения определения метода в объявление класса. Когда класс реализует два или более интерфейса, которые имеют одинаково названные методы, используйте предложения разрешения метода для разрешения конфликтов имен.