Требуется создать новый экземпляр класса в функции, которая получает в качестве параметра объект того же класса. Сам класс заранее не известен.
Вот пример, который я создал, чтобы было понятней:
- Код: Выделить всё
- program sample;
 {$mode objfpc}{$H+}
 uses
 {$IFDEF UNIX}{$IFDEF UseCThreads}
 cthreads,
 {$ENDIF}{$ENDIF}
 Classes;
 type
 { TSampleAbstractClass }
 TSampleAbstractClass = class abstract (TObject)
 private
 Fparam: string;
 public
 constructor Create(const param: string);
 end;
 { TSampleClass }
 TSampleClass = class(TSampleAbstractClass)
 private
 Fobj: TObject;
 public
 constructor Create;
 destructor Destroy; override;
 published
 property obj: TObject read Fobj;
 end;
 var
 sample,sample2: TSampleClass;
 { TSampleClass }
 constructor TSampleClass.Create;
 begin
 Fobj := TObject.Create;
 inherited Create('test');
 end;
 destructor TSampleClass.Destroy;
 begin
 Fobj.Free;
 inherited Destroy;
 end;
 { TSampleAbstractClass }
 constructor TSampleAbstractClass.Create(const param: string);
 begin
 Fparam := param;
 end;
 function test(const obj: TSampleAbstractClass): TSampleAbstractClass;
 begin
 // здесь нужно создать новый объект класса наследника от TSampleAbstractClass
 Result := TSampleAbstractClass(obj.ClassType.Create);
 end;
 begin
 sample := TSampleClass.Create;
 sample2 := TSampleClass(test(sample));
 if not Assigned(sample2.obj) then
 WriteLn('sample2.obj is not assigned')
 else
 WriteLn('sample2.obj is assigned');
 sample2.Free;
 sample.Free;
 ReadLn;
 end.
В моем примере вызывается конструктор, как я понял, класса TObject, а не того класса, который должен.








