Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перекрытие конструктора с расширенным набором параметров [D7, WinXP]


FunkyByte ©   (2006-01-21 14:56:00) 

Доброго времени суток, уважаемые мастера. При написании класса-потомка TForm возникла необходимость перекрыть конструктор, добавив в новом конструкторе 2 дополнительных параметра. Пытался реализовать так:

...
type
 TMyClass=class(TForm)
   ...
 public
   constructor Create(AOwner: TComponent; NewParam1, NewParam2: Extended); override;
   ...
 end;
...

Компиллятор выдаёт ошибку Declaration of 'Create' differs from previous declaration. Как можно решить эту проблему? Заранее благодарен.


SergP   (2006-01-21 21:48:00) [1]


> begin...end ©   (21.01.06 21:35) [16]
> > SergP ©   (21.01.06 21:15) [14]
>
> > Просто старый конструктор используется как и в методах
> данного
> > класса, так и из других юнитов...
>
> constructor Create(...); reintroduce; overload;


блин... действительно так работает.
а я пробовал и
constructor Create(...);  overload;
и
constructor Create(...);  reintroduce;
и
constructor Create(...);  overload; reintroduce;

и не мог понять почему компилятор ругался... :-)


begin...end   (2006-01-21 21:35:00) [2]

> SergP ©   (21.01.06 21:15) [14]

> Просто старый конструктор используется как и в методах данного
> класса, так и из других юнитов...

constructor Create(...); reintroduce; overload;


SergP   (2006-01-21 21:24:00) [3]

Кстати если использовать reintroduсe, то компиляция (ctrl+F9) проходит без ошибок, а вот если сделать build  то и вылазит ошибка
[Error] main.pas(737): Incompatible types: 'Byte' and 'TApplication'

т.е.  компилятор думает что нужно использовать новый констроктор, а в данном случае требуется старый...


SergP   (2006-01-21 21:15:00) [4]

Просто старый конструктор используется как и в методах данного класса, так и из других юнитов...


SergP   (2006-01-21 21:06:00) [5]


> begin...end ©   (21.01.06 18:46) [11]
> > SergP.   (21.01.06 18:43) [10]
>
> reintroduce


дык в том то и дело что reintroduce не проходит...Поэтому и спрашивал... С reintroduse  вообще Error.


Fay   (2006-01-21 18:49:00) [6]

Ответы кто-нибудь читает?


begin...end   (2006-01-21 18:46:00) [7]

> SergP.   (21.01.06 18:43) [10]

reintroduce


SergP.   (2006-01-21 18:43:00) [8]

Кстати, пользуясь случаем и я задам вопросик...

У меня аналогично используется перегрузка (overload)

но как избавиться от варнинга, который уже задолбал?

[Warning] ViewHist.pas(34): Method 'Create' hides virtual method of base type 'TCustomForm'


Alexander Panov   (2006-01-21 18:39:00) [9]

>begin...end

> Почему это?


Ошибся, сообщение действительно здесь будет.


Fay   (2006-01-21 17:46:00) [10]

2 FunkyByte ©   (21.01.06 14:56)
constructor Create(AOwner: TComponent; NewParam1, NewParam2: Extended); reintroduce;


begin...end   (2006-01-21 17:10:00) [11]

> Alexander Panov ©   (21.01.06 17:03) [6]

> У тебя явно ошибка выдается в секции implementation, а не
> в приведенном коде.

Почему это?


Alexander Panov   (2006-01-21 17:03:00) [12]


> Компиллятор выдаёт ошибку Declaration of 'Create' differs
> from previous declaration. Как можно решить эту проблему?
>  Заранее благодарен.


У тебя явно ошибка выдается в секции implementation, а не в приведенном коде.
Кроме того, убери override.

В реализации нового колнструктора вначале можешь вызвать
inherited Create(...);

К тому же, конструктров может быть несколько, необязательно называть новый конструктор так же, как в родительском классе.


begin...end   (2006-01-21 17:02:00) [13]

> Sergey Masloff   (21.01.06 16:23) [3]

> Если старый конструктор тоже нужен (в новом классе хочется
> писать) тогда все же overload

Если старый конструктор нужен в том смысле, что его предполагается вызывать из методов потомка, то подойдёт и reintroduce.


Sergey Masloff   (2006-01-21 16:38:00) [14]

я торможу. В теме ж написано перекрытие...


Sergey Masloff   (2006-01-21 16:23:00) [15]

reintroduce просто давит предупреждение о скрытии базового виртуального метода. Если старый конструктор тоже нужен (в новом классе хочется писать) тогда все же overload


Anatoly Podgoretsky   (2006-01-21 15:04:00) [16]

FunkyByte ©   (21.01.06 14:56)  
Перекрытие с разным набором невозможно в языке.
Можно сделать перегрузку или скрыть старый метод.


begin...end   (2006-01-21 15:03:00) [17]

Замените override на reintroduce.


Наверх

Титульная страница Поиск, карта сайта Написать письмо