Доступ к переопределенным методам

228
13 февраля 2018, 05:15

Есть задача «OverloadResolutionOverride» (Задача):

Что выведет следующий код?

class Foo
{
  public virtual void Quux(int a)
  {
    Console.WriteLine("Foo.Quux(int)");
  }
}
class Bar : Foo
{
  public override void Quux(int a)
  {
    Console.WriteLine("Bar.Quux(int)");
  }
  public void Quux(object a)
  {
    Console.WriteLine("Bar.Quux(object)");
  }
}
class Baz : Bar
{
  public override void Quux(int a)
  {
    Console.WriteLine("Baz.Quux(int)");
  }
  public void Quux<T>(params T[] a)
  {
    Console.WriteLine("Baz.Quux(params T[])");
  }
}
void Main()
{
  new Bar().Quux(42);
  new Baz().Quux(42);
}

Данный код выведет:

Bar.Quux(object)
Baz.Quux(params T[])

В ответе к этой задаче указано:

"Есть такое правило: если при вызове некоторого метода в «текущем» классе находится подходящая сигнатура, то компилятор не будет даже смотреть на родительские классы."

Разве считается, что перегруженный метод Quux(int) находится в базовом классе, а не в текущем? И если так и есть, то каким образом мне обратиться именно к методу Quux(int) текущего класса?

Answer 1
public void Quux(object a)
{
  Console.WriteLine("Bar.Quux(object)");
}

в классе Bar и

public void Quux<T>(params T[] a)
{
  Console.WriteLine("Baz.Quux(params T[])");
}

в классе Baz точно такими методами, как в ответе к этой задаче:

Eсли при вызове некоторого метода в «текущем» классе находится подходящая сигнатура, то компилятор не будет даже смотреть на родительские классы.

Другие 2 методы, имея override, хотят от компилатора смотреть на родительские классы (имеют сигнатуру с декорацией).

Answer 2

Чтобы вызвать конкретно Quux(int) из Bar или Baz нужно явным образом привести обьект класса к Foo:

Foo bar = new Bar();
Foo baz = new Baz();
bar.Quux(42); 
baz.Quux(42);

Тогда получим желаемый вывод:

Bar.Quux(int)
Baz.Quux(int)
READ ALSO
Сборки нейтральные к домену

Сборки нейтральные к домену

Что это за зверь, как это сделать и когда этот хинт лучше использовать?

194
Изменить размер рамки WS_SIZEBOX

Изменить размер рамки WS_SIZEBOX

Пишу свой интерфейс(для теста)Задал форме свойство FormBorderStyle = None Также, перегрузил данное свойство, дабы менять размер формы:

276
Правильный запуск *.exe - C#

Правильный запуск *.exe - C#

Добрый день ребят, нуждаюсь в Вашей помощи, уже бьюсь неделю над одним вопросом, ничего в голову не приходит Есть игровой лаунчер, естественно...

175
Проверка содержимого буфера обмена

Проверка содержимого буфера обмена

Как можно проверить содержит ли буфер обмена текст, картинку или ссылку?

200