Главная страница
    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.47 MB
Время: 0.047 c
15-1250095032
Григорьев Антон
2009-08-12 20:37
2009.10.25
Осторожно! Новый вирус, специфичный для Delphi


15-1250850838
Медвежонок Пятачок
2009-08-21 14:33
2009.10.25
перечень нехорошего


2-1251403436
LSE
2009-08-28 00:03
2009.10.25
ScanLine


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


1-1220066174
Xandr001
2008-08-30 07:16
2009.10.25
Refresh в браузере





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский