program Generics; {$APPTYPE CONSOLE} {$R *.res} uses FastMM4 , System.SysUtils , System.Classes ; type TObjectCreator = class FObject: TObject; constructor Create(aObject: TObject); destructor Destroy; override; end; TGenObjectCreator = class FObject: TC; constructor Create; destructor Destroy; override; end; {TObjectCreator} constructor TObjectCreator.Create(aObject: TObject); begin FObject := aObject; writeln(Format('class FObject (%s) created', [FObject.ClassName])); end; destructor TObjectCreator.Destroy; begin if Assigned(FObject) then FObject.Free; end; {TGenObjectCreator} constructor TGenObjectCreator.Create; begin FObject := TC.Create; writeln(Format('class FObject (%s) created', [TC.ClassName])); end; destructor TGenObjectCreator.Destroy; begin FObject.Free; end; begin try { TODO -oUser -cConsole Main : Insert code here } ///////////////////////////////////// /// typecasting avoiding with Generics /// /// 1. using classic TObject writeln('TObjectCreator creation ..'); with TObjectCreator.Create(TStringList.Create) do try TStringList(FObject).Append('first'); // typecast necessary writeln('typecast necessary to call real object''s methods:'); writeln(TStringList(FObject).Text); finally Free; end; /// 2. using generic TObject writeln('TGenObjectCreator creation ..'); with TGenObjectCreator.Create do try FObject.Append('first'); writeln(Format('NO typecast necessary to call %s''s methods:', [FObject.ClassName])); writeln(FObject.Text); finally Free; end; readln; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end.