создать новый экземпляр класса по объекту класса
Добавлено: 27.03.2019 11:20:00
Здравствуйте!
Требуется создать новый экземпляр класса в функции, которая получает в качестве параметра объект того же класса. Сам класс заранее не известен.
Вот пример, который я создал, чтобы было понятней:
В моем примере вызывается конструктор, как я понял, класса TObject, а не того класса, который должен.
Требуется создать новый экземпляр класса в функции, которая получает в качестве параметра объект того же класса. Сам класс заранее не известен.
Вот пример, который я создал, чтобы было понятней:
- Код: Выделить всё
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, а не того класса, который должен.