Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите с Классами [D7, XP]


Merlin_88 ©   (2009-09-02 18:34:00) 

Есть 2 Класса:

type
 TMainClass = class (TObject)
   FDataObjectClass : TClass;
   FDataObject : TObject;
 public
   constructor Create(aClass: TClass);
 end;

type
 TSubClass = class (TObject)
 public
   constructor Create(aClass: TClass);
 end;


implementation

constructor TMainClass.Create(aClass: TClass);
begin
 inherited Create;
 FDataObjectClass := aClass;
 FDataObject := FDataObjectClass.Create;
end;

constructor TSubClass.Create(aClass: TClass);
begin
 inherited Create;
end;

Вызываю: TMainClass.Create(TSubClass);
В конструктор TMainClass-а входит, а из него в конструктор TSubClass подскажите почему и как с этим бороться?


Германн   (2009-09-04 02:16:00) [1]


> Юрий Зотов ©   (03.09.09 11:41) [9]
>
> > Германн ©   (03.09.09 02:08) [6]
>

Понял.
Просто не о том подумал.


Юрий Зотов   (2009-09-03 11:58:00) [2]

Точнее, немного не так, а вот так:

type
TParentClass = class
public
  constructor Create1;
  constructor Create2; virtual;
end;

TChildClass = class(TParentClass)
public
  constructor Create1;
  constructor Create2; override;
end;

TParentFamily = class of TParentClass;

var
 F: TParentFamily;
 C: TParentClass;
begin
 F := TChildClass;
 C := F.Create1; // Но будет вызван TParentClass.Create1
 C := F.Create2; // А здесь будет вызван TChildClass.Create2


Юрий Зотов   (2009-09-03 11:41:00) [3]

> Германн ©   (03.09.09 02:08) [6]

type
 TParentClass = class
 public
   constructor Create1;
   constructor Create2; virtual;
 end;

 TChildClass = class(TParentClass)
 public
   constructor Create1;
   constructor Create2; override;
 end;

var
 C: TParentClass;
begin
 C := TChildClass.Create1; // Но будет вызван TParentClass.Create1
 C := TChildClass.Create2; // А здесь будет вызван TChildClass.Create2


Anatoly Podgoretsky   (2009-09-03 09:07:00) [4]


> Я ещё чего-то не знаю?

Про виртуальные конструкторы


Merlin_88   (2009-09-03 08:05:00) [5]

Всем большое спасибо, разобрался.


Германн   (2009-09-03 02:08:00) [6]


> Юрий Зотов ©   (03.09.09 01:11) [5]

Не понял.
Я ещё чего-то не знаю?


Юрий Зотов   (2009-09-03 01:11:00) [7]

Возможно, конструктору не хватает virtiual.


Kolan   (2009-09-02 22:57:00) [8]


> В конструктор TMainClass-а входит, а из него в конструктор
> TSubClass подскажите почему и как с этим бороться?

Видимо пропущено «нет», то есть должно было быть: В конструктор TMainClass-а входит, а из него в конструктор TSubClass нет, подскажите почему и как с этим бороться?

Если так, то:

Смотрите в TSubClassконструктор объявлен как constructor Create( aClass: TClass);. С параметром. А ваш код компилируется. Вывод — вы вызываете не тот Create.

И действительно. FDataObjectClass  — это TClassи о конструкторе TSubClass он ничего не знает.

Поэтому делая такой вызов вы вызываете унаследованный конструктор, то есть конструктор TObject'a.

Исправить можно определив точнее тип класса.


Омлет   (2009-09-02 21:29:00) [9]

type
 TMy = class
 public
  constructor CreateX; virtual; abstract;
 end;

 TMyClass = class of TMy;

 TMainClass = class (TObject)
    FDataObjectClass : TMyClass;
    FDataObject : TObject;
  public
    constructor Create(aClass: TMyClass);
  end;

  TSubClass = class (TMy)
  public
    constructor CreateX; override;
  end;

implementation

constructor TMainClass.Create(aClass: TMyClass);
begin
inherited Create;
FDataObjectClass := aClass;
FDataObject := FDataObjectClass.CreateX;
end;

constructor TSubClass.CreateX;
begin
ShowMessage('dd');
end;

TMainClass.Create(TSubClass);


Омлет   (2009-09-02 20:53:00) [10]

Потому что в TSubClass.Create ничего нет.


Merlin_88   (2009-09-02 18:35:00) [11]

> а из него в конструктор TSubClass-а не входит


Наверх

Титульная страница Поиск, карта сайта Написать письмо