Приведение объекта к типу интерфейса без TInterfacedObject в качестве базового класса
Мне нужен интерфейс реализации класса без подсчета ссылок. Я сделал следующее:
IMyInterface = interface(IInterface)
['{B84904DF-9E8A-46E0-98E4-498BF03C2819}']
procedure InterfaceMethod;
end;
TMyClass = class(TObject, IMyInterface)
protected
function _AddRef: Integer;stdcall;
function _Release: Integer;stdcall;
function QueryInterface(const IID: TGUID; out Obj): HResult;stdcall;
public
procedure InterfaceMethod;
end;
procedure TMyClass.InterfaceMethod;
begin
ShowMessage('The Method');
end;
function TMyClass.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
if GetInterface(IID, Obj) then
Result := 0
else
Result := E_NOINTERFACE;
end;
function TMyClass._AddRef: Integer;
begin
Result := -1;
end;
function TMyClass._Release: Integer;
begin
Result := -1;
end;
Отсутствие подсчета ссылок работает нормально. Но меня беспокоит то, что я не могу броситьTMyClass
вIMyInterface
с помощьюas
оператор:
var
MyI: IMyInterface;
begin
MyI := TMyClass.Create as IMyInterface;
Мне дают
[Ошибка DCC] E2015 Оператор не применим к этому типу операнда
Проблема исчезает, когдаTMyClass
происходит отTInterfacedObject
Т.е. я могу делать такое приведение без ошибки компилятора. Очевидно, что я не хочу использовать TInterfacedObject в качестве базового класса, поскольку это сделает мою ссылку на класс подсчитанной. Почему такой кастинг запрещен и как его обойти?