{ %NORUN } program tw30626b; {$mode objfpc} type generic IBase = interface(IUnknown) function Test: specialize IBase; end; generic TBase = class(TInterfacedObject, specialize IBase) public function Test: specialize IBase; virtual; end; generic TDerived = class(specialize TBase) public function Test: specialize IBase; override; end; function TBase.Test: specialize IBase; begin result := specialize TDerived.Create; end; function TDerived.Test: specialize IBase; begin result := specialize TDerived.Create; end; type IIntegerBase = specialize IBase; var Intf, Intf2: IIntegerBase; begin Intf:= specialize TDerived.Create; Intf2:= Intf.Test; end.