Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.041 c
15-1249924710
Германн (из Бердянска)
2009-08-10 21:18
2009.10.25
Программка для логирования (учета) траффика


1-1221818257
Jolik
2008-09-19 13:57
2009.10.25
Как передать форму по сети :)


2-1251902073
Merlin_88
2009-09-02 18:34
2009.10.25
Помогите с Классами


2-1251352990
Евгений Р.
2009-08-27 10:03
2009.10.25
Как изменить высоту строк tDbGrid?


2-1251666355
wah
2009-08-31 01:05
2009.10.25
Многострочность и StringGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский