Создать новый экземпляр класса
От: Slava Antonov Россия http://deadbeef.narod.ru
Дата: 16.04.06 02:39
Оценка:
Привет.

Пусть есть базовый класс и наследники от него. На вход функции дается объект (как базовый класс). Как в функции создать новый объект того класса что и данный на входе объект?

Можно завести у базового класса метод типа MakeCopy, но может можно и без этого обойтись? Нужно ковыряться с NewInstance?

--
Всего хорошего, Слава
ICQ: 197577902
Posted via RSDN NNTP Server 2.0
Re: Создать новый экземпляр класса
От: awod Россия  
Дата: 16.04.06 06:29
Оценка:
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;
С уважением AWOD.
Re: Создать новый экземпляр класса
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 16.04.06 06:47
Оценка: -2
Здравствуйте, Slava Antonov, Вы писали:

SA>Пусть есть базовый класс и наследники от него. На вход функции дается объект (как базовый класс). Как в функции создать новый объект того класса что и данный на входе объект?


Вариант:
1. Базовый мето должен содержать виртуальный конструктор.
2. Наследники дожны понеобходимости перекрывать его.
3. Просто потом выызвать этот конструктор...
Примерно так:

type 
  TObj = class
    constructor Create; virtual; // Вместо Create можно использовать любое другое имя, например MakeInstance :)
  end;

  TObj1 = class(TObj);
    constructor Create; override; // Перекрываем конструктор, список параметров должен совпадать с TObj.Create
  end;

procedure F(O: TObj);
var
  O2: TObj;
begin
  O2 := O.Create;
end;
Re[2]: Создать новый экземпляр класса
От: Slava Antonov Россия http://deadbeef.narod.ru
Дата: 16.04.06 10:52
Оценка:
Hello Mystic, you wrote:

> procedure F(O: TObj);

> var
> O2: TObj;
> begin
> O2 := O.Create;
> end;

Тут не создается второй копии. Здесь Create отрабатывает как обычный метод.

--
Всего хорошего, Слава
ICQ: 197577902
Posted via RSDN NNTP Server 2.0
Re[2]: Создать новый экземпляр класса
От: Slava Antonov Россия http://deadbeef.narod.ru
Дата: 16.04.06 10:52
Оценка:
Hello Mystic, you wrote:

> procedure F(O: TObj);

> var
> O2: TObj;
> begin
> O2 := O.Create;
> end;

Тут не создается второй копии. Здесь Create отрабатывает как обычный метод.

--
Всего хорошего, Слава
ICQ: 197577902
Posted via RSDN NNTP Server 2.0
Re: Создать новый экземпляр класса
От: ekamaloff Великобритания  
Дата: 17.04.06 04:45
Оценка: 4 (1)
Здравствуйте, Slava Antonov, Вы писали:


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
Re[2]: Создать новый экземпляр класса
От: Slava Antonov Россия http://deadbeef.narod.ru
Дата: 17.04.06 05:38
Оценка:
Здравствуйте, ekamaloff, Вы писали:

E> Result := TBaseClass(O.ClassType).Create;


Вот в чем дело... я сам пробовал так:
TBase(O.ClassType).Create. Теперь понятно.
Re: Создать новый экземпляр класса
От: OAR  
Дата: 17.04.06 08:40
Оценка:
Здравствуйте, Slava Antonov, Вы писали:

SA>Привет.


SA>Пусть есть базовый класс и наследники от него. На вход функции дается объект (как базовый класс). Как в функции создать новый объект того класса что и данный на входе объект?


SA>Можно завести у базового класса метод типа MakeCopy, но может можно и без этого обойтись? Нужно ковыряться с NewInstance?


SA>--

SA>Всего хорошего, Слава
SA>ICQ: 197577902


Почитай книгу Р.Лишнера "Delphi.Справочник". Там очень хорошо рассмотрен жизненный цикл создания объекта и его уничтожения.
Re[3]: Создать новый экземпляр класса
От: ekamaloff Великобритания  
Дата: 17.04.06 08:42
Оценка:
Здравствуйте, Slava Antonov, Вы писали:

<>

А чем тебя собственно не устроило простое

TBase.Create

?
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[4]: Создать новый экземпляр класса
От: Slava Antonov Россия http://deadbeef.narod.ru
Дата: 17.04.06 11:48
Оценка:
Hello ekamaloff, you wrote:

> А чем тебя собственно не устроило простое

> TBase.Create

Мне не нужно создавать объект базового класса (тем более что он абстрактный). Мне нужно создать объект того же класса, которого был данный на вход функции объект.

--
Всего хорошего, Слава
ICQ: 197577902
Posted via RSDN NNTP Server 2.0
Re[2]: Создать новый экземпляр класса
От: Slava Antonov Россия http://deadbeef.narod.ru
Дата: 17.04.06 11:49
Оценка:
Hello OAR, you wrote:

> Почитай книгу Р.Лишнера "Delphi.Справочник". Там очень хорошо рассмотрен жизненный цикл создания объекта и его уничтожения.


Не спасибо. Ради одного вопроса искать книгу? Спасибо еще раз.

--
Всего хорошего, Слава
ICQ: 197577902
Posted via RSDN NNTP Server 2.0
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.