![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите с Классами [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-а не входит