No, that is not right. You can add an interface to any class you like:
type IAdapter = interface procedure DoSomething; end; TAdapter = class(TBaseClass, IInterface, IAdapter) private FRefCount: Integer; procedure DoSomething; protected function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall; function _AddRef: Integer; stdcall; function _Release: Integer; stdcall; end; function TAdapter.QueryInterface(const IID: TGUID; out Obj): HResult; begin if GetInterface(IID, Obj) then Result := 0 else Result := E_NOINTERFACE; end; function TAdapter._AddRef: Integer; begin Result := InterlockedIncrement(FRefCount); end; function TAdapter._Release: Integer; begin Result := InterlockedDecrement(FRefCount); if Result = 0 then Destroy; end; procedure TAdapter.DoSomething; begin end;
source share