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