Главная страница
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.02 c
15-1251518417
Nic
2009-08-29 08:00
2009.10.25
Западные Финансовые/Деловые СМИ


2-1251913566
Shyrick
2009-09-02 21:46
2009.10.25
SQL-запрос


15-1251061394
syte_ser78
2009-08-24 01:03
2009.10.25
программы как в сериале "Сеть"


2-1251200949
yantux
2009-08-25 15:49
2009.10.25
Как конвертнуть extended в word?


6-1207567582
Real
2008-04-07 15:26
2009.10.25
FTP индикация закачки больших файлов