Форум: "Начинающим";
Текущий архив: 2009.10.25;
Скачать: [xml.tar.bz2];
ВнизПомогите с Классами Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.05 c