program Project1; {$mode objfpc}{$H+} type generic TFoo<T> = class function foo: T; virtual; abstract; end; TRec = record field: integer; end; TInter = specialize TFoo<TRec>; TBar = class(TInter) function foo: TRec; override; end; function TBar.foo: TRec; begin result.field := 0; exit(result); end; begin end.