Есть задача «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) текущего класса?
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, хотят от компилатора смотреть на родительские классы (имеют сигнатуру с декорацией).
Чтобы вызвать конкретно 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)
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости