program Project7; uses Dialogs, Controls; type TParent = class protected Field: string; public constructor Create; virtual; procedure VeryComplexAlgo; end; TChildA = class(TParent) public constructor Create; override; end; TChildB = class(TParent) public constructor Create; override; end; TParentClass = class of TParent; function GetClassFromUser:TParentClass; begin if MessageDlg('Use TChildA?', mtConfirmation, [mbYes, mbNo], 0)=mrYes then result := TChildA else result := TChildB end; { TParent } constructor TParent.Create; begin Field := 'TParent' end; procedure TParent.VeryComplexAlgo; begin ShowMessage(Field) end; { TChildA } constructor TChildA.Create; begin inherited; Field := Field + ' TChildA'; end; { TChildB } constructor TChildB.Create; begin inherited; Field := Field + ' TChildB'; end; begin GetClassFromUser.Create.VeryComplexAlgo end.