{ %NORUN } program tw30626; {$mode objfpc} type generic IBase = interface(IUnknown) end; generic TBase = class(TInterfacedObject, specialize IBase) public function Test: specialize IBase; end; generic TDerived = class(specialize TBase) end; function TBase.Test: specialize IBase; begin result := (specialize TDerived).Create; end; type TIntDerived = specialize TDerived; var t: TIntDerived; begin t := TIntDerived.Create; t.Test; end.