Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.10.25;
Скачать: CL | DM;

Вниз

Помогите с Классами   Найти похожие ветки 

 
Merlin_88   (2009-09-02 18:34) [0]

Есть 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 подскажите почему и как с этим бороться?


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

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


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

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


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

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);


 
Kolan ©   (2009-09-02 22:57) [4]


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

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

Если так, то:

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

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

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

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


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

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


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


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

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


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

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


 
Anatoly Podgoretsky ©   (2009-09-03 09:07) [8]


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

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


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

> Германн ©   (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


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

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

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-04 02:16) [11]


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

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



Страницы: 1 вся ветка

Текущий архив: 2009.10.25;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.023 c
2-1251091182
Interesting
2009-08-24 09:19
2009.10.25
Как возвести число в степень?


15-1250689966
antonn
2009-08-19 17:52
2009.10.25
Подсобите с прогоном теста


15-1251145808
Юрий
2009-08-25 00:30
2009.10.25
С днем рождения ! 25 августа 2009 вторник


1-1222031699
Д С
2008-09-22 01:14
2009.10.25
Событие показа формы.


15-1251491404
Юрий
2009-08-29 00:30
2009.10.25
С днем рождения ! 29 августа 2009 суббота