Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Перегрузка виртуального метода / 18 сообщений из 18, страница 1 из 1
14.11.2017, 19:11:13
    #39553053
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка виртуального метода
Есть два класса
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
TBase = class
public
  procedure Test; virtual;
end;

TChild = class(TBase)
public
  procedure Test(AVal: Integer); overload;
end;



На второй метод компилятор выдает ворнинг
[dcc32 Warning]W1010 Method 'Test' hides virtual method of base type 'TBase'
Есть какой-то цивилизованный способ подавить ворнинг кроме
Код: pascal
1.
{WARN HIDDEN_VIRTUAL OFF}



На такой класс
Код: pascal
1.
2.
3.
4.
5.
TChild2 = class(TBase)
public
  procedure Test; overload; override;
  procedure Test(AVal: Integer); overload;
end;


на выделенной строке тот же ворнинг


С уважением, Vasilisk
...
Рейтинг: 0 / 0
14.11.2017, 19:12:49
    #39553057
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка виртуального метода
Нашел такой способ
Код: pascal
1.
2.
3.
4.
TChild = class(TBase)
public
  procedure Test(AVal: Integer); reintroduce; overload;
end;

насколько это кошерно?
...
Рейтинг: 0 / 0
14.11.2017, 19:14:23
    #39553059
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка виртуального метода
_Vasilisk_,

прикалываешься?
...
Рейтинг: 0 / 0
14.11.2017, 19:15:36
    #39553060
Лись
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка виртуального метода
Просто базовый пометь как overload:

Код: pascal
1.
2.
3.
4.
TBase = class
public
  procedure Test; overload; virtual;
end;
...
Рейтинг: 0 / 0
14.11.2017, 19:29:35
    #39553070
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка виртуального метода
чччДприкалываешься?Не
ЛисьПросто базовый пометь как overload:Вариант, конечно. Но как бы базовый метод не обязан знать, что его будут перегружать в наследнике
...
Рейтинг: 0 / 0
14.11.2017, 20:24:15
    #39553101
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка виртуального метода
_Vasilisk_насколько это кошерно?
Ну эта директива просто подтверждает компилятору, что вы знаете что делаете, и точно так же тупо давит предупреждение.
...
Рейтинг: 0 / 0
14.11.2017, 21:14:32
    #39553117
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка виртуального метода
_Vasilisk_Нашел такой способ
Код: pascal
1.
2.
3.
4.
TChild = class(TBase)
public
  procedure Test(AVal: Integer); reintroduce; overload;
end;

насколько это кошерно?

Абсолютно кошерно. Когда надо в наследнике Tcomponent применить конструктор с аргументами, отличающимися от стандартного Create (AOwner: TComponent) слово reintroduce пишется на автомате.
...
Рейтинг: 0 / 0
14.11.2017, 21:16:24
    #39553119
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка виртуального метода
Только overload после reintroduce не надо писать
...
Рейтинг: 0 / 0
15.11.2017, 15:31:24
    #39553629
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка виртуального метода
schiТолько overload после reintroduce не надо писатьМне нужно именно overload. Т.е. в наследнике я хочу видеть два перегруженных метода. Один виртуальный из родителя (быть может переопределенный в наследнике), а второй невиртуальный из наследника
...
Рейтинг: 0 / 0
15.11.2017, 16:11:12
    #39553670
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка виртуального метода
_Vasilisk_,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
type
  TBase = class
    procedure Test; overload; virtual;
  end;

  TPuppy = class(TBase)
    procedure Test(A: Integer); overload;
  end;


В 7ке нормально работает.
...
Рейтинг: 0 / 0
15.11.2017, 16:12:44
    #39553671
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка виртуального метода
_Vasilisk_Вариант, конечно. Но как бы базовый метод не обязан знать, что его будут перегружать в наследнике
Как бы компилятор обязан знать, какие методы будут перегружать. Иначе потребуются извращения и хаки.
...
Рейтинг: 0 / 0
15.11.2017, 18:05:34
    #39553784
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка виртуального метода
_Vasilisk_schiТолько overload после reintroduce не надо писатьМне нужно именно overload. Т.е. в наследнике я хочу видеть два перегруженных метода. Один виртуальный из родителя (быть может переопределенный в наследнике), а второй невиртуальный из наследника

Я бы у второго (невиртуального в наследнике) поменял имя и не парился бы.
...
Рейтинг: 0 / 0
15.11.2017, 21:54:53
    #39553896
Уважаемый автор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка виртуального метода
_Vasilisk_,
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
TBase = class
public
  procedure Test; virtual;
end;

TChild = class(TBase)
public
  procedure Test(AVal: Integer); overload; override;
end;



вот так надо!
...
Рейтинг: 0 / 0
22.11.2017, 21:29:47
    #39557878
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка виртуального метода
Уважаемый авторвот так надо!Так не надо
[dcc32 Error]E2037 Declaration of 'Test' differs from previous declaration
...
Рейтинг: 0 / 0
22.11.2017, 22:10:45
    #39557904
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка виртуального метода
_Vasilisk_Нашел такой способ
Код: pascal
1.
2.
3.
4.
TChild = class(TBase)
public
  procedure Test(AVal: Integer); reintroduce; overload;
end;

насколько это кошерно?
Грустно.... Когда задают такие вопросы... особенно опытные... на собеседовании я бы закончил разговор.

Из справки
helpAn override declaration must match the ancestor declaration in the order and type of its parameters and in its result type (if any).
helpUse reintroduce when you want to hide an inherited virtual method with a new one
Если вы хотите чтобы 2 метода объявленные в разных классах, один из которых наследник второго, были видны другим наследникам, то оба метода объявляете override.
Если вы хотите, чтобы эти методы могли изменять в наследниках, то добавляете еще virtual.
Если вы хотите для последующих наследников скрыть базовую реализацию в базовом классе и оставить видимой последнюю, то используете reintroduce
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
TA = class
  public
    procedure Test1; virtual;
    procedure Test2; overload; virtual;
    procedure Test3; virtual;
    procedure Test4; virtual;
  end;

  TB = class(TA)
  public
    procedure Test1(const aParam: Int32); reintroduce; virtual;
    procedure Test2(const aParam: Int32); overload; virtual;
    procedure Test3; override;
    procedure Test4; overload; override;
    procedure Test4(const aParam: Int32); reintroduce; overload; virtual;
  end;

  TC = class(TB)
  public
    procedure Test1(const aParam: Int32); override;
    procedure Test2; override;
    procedure Test2(const aParam: Int32); override;
    procedure Test3; override;
    procedure Test4; override;
    procedure Test4(const aParam: Int32); overload; override;
  end;



Цель то какая?
...
Рейтинг: 0 / 0
22.11.2017, 22:18:18
    #39557907
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка виртуального метода
Насколько я понял Test4 же ваш случай? Вот так и будет кошерно...
...
Рейтинг: 0 / 0
23.11.2017, 00:55:22
    #39557966
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка виртуального метода
X-CiteЕсли вы хотите чтобы 2 метода объявленные в разных классах, один из которых наследник второго, были видны другим наследникам, то оба метода объявляете override.Дальше можно не читать. Нельзя указать override для невиртуального метода
X-CiteЕсли вы хотите для последующих наследников скрыть базовую реализацию в базовом классе и оставить видимой последнюю, то используете reintroduceВы удивитесь, но reintroduce overload работает именно так как мне нужно. Видны два перегруженных метода один из которых виртуальный
...
Рейтинг: 0 / 0
23.11.2017, 19:10:55
    #39558576
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка виртуального метода
_Vasilisk_Вы удивитесь, но reintroduce overload работает именно так как мне нужно. Видны два перегруженных метода один из которых виртуальный
да, меня это тоже удивляло - две как бы противоположные по смыслу директивы
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Перегрузка виртуального метода / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]