You can do something along those lines already using advanced records and default constructor parameters.
program Project1;
{$mode objfpc}{$H+}
{$ModeSwitch advancedrecords}
type
{ TMyRecord }
TMyRecord = record
a, b, c: integer;
procedure Init(anA: integer=0; aB: integer=1; aC: integer=2);
end;
{ TMyClass }
TMyClass = Class
strict private
FRec: TMyRecord;
public
function GetState: TMyRecord;
constructor Create;
constructor Create(const aRec: TMyRecord);
end;
{ TMyClass }
constructor TMyClass.Create;
begin
inherited Create;
FRec.Init();
end;
function TMyClass.GetState: TMyRecord;
begin
Result:=FRec;
end;
constructor TMyClass.Create(const aRec: TMyRecord);
begin
inherited Create;
FRec:=aRec;
end;
{ TMyRecord }
procedure TMyRecord.Init(anA: integer; aB: integer; aC: integer);
begin
a:=anA;
b:=aB;
c:=aC;
end;
var
mc: TMyClass;
mr: TMyRecord;
begin
WriteLn('Default constructor:');
mc:=TMyClass.Create;
mr:=mc.GetState;
WriteLn('TMyClass record values are a=',mr.a,' b=',mr.b,' c=',mr.c);
mc.Free;
WriteLn;
mr.Init(100,200,300);
WriteLn('With overloaded constructor:');
mc:=TMyClass.Create(mr);
mr:=mc.GetState;
WriteLn('TMyClass record values are a=',mr.a,' b=',mr.b,' c=',mr.c);
mc.Free;
ReadLn;
end.