delphiinterfacecastingpascaldelphi-2009

How to cast an Interface to an Object in Delphi


In Delphi 2009 I have a reference to an IInterface which I want to cast to the underlying TObject.

Using TObject(IInterface) obviously doesn’t work in Delphi 2009 (it’s supposed to work in Delphi 2010 though).

My searches lead me to a function that should do the trick, but it doesn’t work for me. I get access violations when I try to call methods on the returned object.

I can’t really modify the classes and I know that this breaks OOP.


Solution

  • Instead of relying on Delphi's internal object layout you could also have your objects implement another interface which would simply return the object. This, of course, only works if you have access to the source code of the objects to begin with, but you probably shouldn't even use these hacks if you don't have access the source code of the objects.

    interface 
    
    type
      IGetObject = interface
        function GetObject: TObject;
      end;
    
      TSomeClass = class(TInterfacedObject, IGetObject)
      public
        function GetObject: TObject;
      end;
    
    implementation
    
    function TSomeClass.GetObject: TObject;
    begin
      Result := Self;
    end;