Пусть есть базовый класс и наследники от него. На вход функции дается объект (как базовый класс). Как в функции создать новый объект того класса что и данный на входе объект?
Можно завести у базового класса метод типа MakeCopy, но может можно и без этого обойтись? Нужно ковыряться с NewInstance?
SA>Привет. SA>Пусть есть базовый класс и наследники от него. На вход функции дается объект (как базовый класс). Как в функции создать новый объект того класса что и данный на входе объект? SA>Можно завести у базового класса метод типа MakeCopy, но может можно и без этого обойтись? Нужно ковыряться с NewInstance?
А может базовый класс сделать наследником TPersistent и регестрировать каждый класс через RegisterClass.
Сделать TBaseClass = class of TBase;
Тогда можно будет воспользоваться
var
tmpClass : TClass;
begin
tmpClass := GetClass(ASomeInClass.ClassName);
if tmpClass <> nil then
tmpFrame := TBaseClass(tmpClass).Create(some parameters)
end;
Здравствуйте, Slava Antonov, Вы писали:
SA>Пусть есть базовый класс и наследники от него. На вход функции дается объект (как базовый класс). Как в функции создать новый объект того класса что и данный на входе объект?
Вариант:
1. Базовый мето должен содержать виртуальный конструктор.
2. Наследники дожны понеобходимости перекрывать его.
3. Просто потом выызвать этот конструктор...
Примерно так:
type
TObj = class
constructor Create; virtual; // Вместо Create можно использовать любое другое имя, например MakeInstance :)end;
TObj1 = class(TObj);
constructor Create; override; // Перекрываем конструктор, список параметров должен совпадать с TObj.Createend;
procedure F(O: TObj);
var
O2: TObj;
begin
O2 := O.Create;
end;
program Project2;
{$APPTYPE CONSOLE}uses SysUtils;
type
TBaseClass = class of TBase;
TBase = class
public
constructor Create; virtual;
end;
TDerived = class(TBase)
public
constructor Create; override;
end;
function CreateNew(O: TBase): TBase;
begin
Result := TBaseClass(O.ClassType).Create;
end;
{ TDerived }constructor TDerived.Create;
begin
inherited;
Writeln('In Derived constructor');
end;
{ TBase }constructor TBase.Create;
begin
Writeln('In Base constructor');
end;
var
O, O2: TBase;
begin
O := TDerived.Create;
O2 := CreateNew(O);
O.Free;
O2.Free;
ReadLn;
end.
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Здравствуйте, Slava Antonov, Вы писали:
SA>Привет.
SA>Пусть есть базовый класс и наследники от него. На вход функции дается объект (как базовый класс). Как в функции создать новый объект того класса что и данный на входе объект?
SA>Можно завести у базового класса метод типа MakeCopy, но может можно и без этого обойтись? Нужно ковыряться с NewInstance?
SA>-- SA>Всего хорошего, Слава SA>ICQ: 197577902
Почитай книгу Р.Лишнера "Delphi.Справочник". Там очень хорошо рассмотрен жизненный цикл создания объекта и его уничтожения.
Hello ekamaloff, you wrote:
> А чем тебя собственно не устроило простое > TBase.Create
Мне не нужно создавать объект базового класса (тем более что он абстрактный). Мне нужно создать объект того же класса, которого был данный на вход функции объект.