Тема хоть и стара, но листая ответы, так и не удалось встретить ожидаемое чистое решение.
Sergei I. Gorelkin писал(а):Единственный способ - добавить в интерфейс лишний метод, который будет возвращать Self.
В точку и без шаманства.
Odyssey писал(а):- Код: Выделить всё
function IMyIntf.GetObject: TObject;
а во всех реализующих его классах делать
- Код: Выделить всё
function TMyIntfImpl.GetObject: TObject;
begin
Result := Self;
end;
И это даже почти не шаманство

На верном пути ...
Чистое решение: Класс TComponent использует модель одновременной работы с объектами и итерфейсами, которые эти объекты реализуют.
Это позволяет компонентам реализовывать интерфейсы, и дать возможность интерфейсным свойствам использоваться в инспекторе объектов. А чтобы работать с опубликованными интерфейсными свойствами, необходим сам компонент для того, чтобы иметь возможность получить имя компонента, проверить его свойства и т.д..
Как раз TComponent использует чистое решение: он реализует интерфейс
IInterfaceComponentReference с единственным методом
GetComponent, который и возвращает компонент, реализующий интерфейс.
Определение взято из
Delphi 7 "Classes.pas":
- Код: Выделить всё
IInterfaceComponentReference = interface
['{E28B1858-EC86-4559-8FCD-6B4F824151ED}']
function GetComponent: TComponent;
end;
В таком случае код можно написать так:
- Код: Выделить всё
TExampleObject = class;
IExampleInterfaceObjectReference = interface
['Ctrl + Shift + G']
function GetObject: TExampleObject;
end;
TExampleObject = (TObject, IExampleInterfaceObjectReference, ...)
...
function GetObject: TExampleObject;
end;
implementatoin // РЕАЛИЗАЦИЯ
function TExampleObject.GetObject:TExampleObject;
begin
Result := Self;
end;
Пример использования:
- Код: Выделить всё
var
ExampleIntf :IExampleObject;
ExampleObj :TExampleObject;
begin
ExampleObj := (ExampleIntf as IExampleInterfaceObjectReference).GetObject;
Caption := ExampleObj.ClassName;
end;
Следует при этом учитывать, что обнуление ссылок на интерфейс может привести к разрушению объекта до его использования через объектную ссылку. У TComponent методы
_AddRef и
_Release возвращают -1 и не влияют на счётчик.
P.S.: А ведь некоторые ждали выхода Delphi 2010

.