Вывод типа с интерфейсами

1

Как раз на днях я кулак по ошибке, которая на самом деле заняла некоторое время, чтобы понять. Как-то казалось, что неправильная перегрузка была выполнена при выполнении через унаследованный интерфейс. Взгляните на этот код.

class Program
{
    static void Main(string[] args)
    {
        IBar bar = new Bar();                   
        bar.Execute("TEST");
    }
}


public interface IFoo
{
    void Execute(string value);
}

public interface IBar : IFoo
{
    void Execute(object value);
}

public class Foo : IFoo
{
    public void Execute(string value)
    {
        Console.WriteLine("Foo.Execute - string");
    }
}

public class Bar : IBar
{
    public void Execute(string value)
    {
        Console.WriteLine("Bar.Execute - string");
    }

    public void Execute(object value)
    {
        Console.WriteLine("Bar.Execute - object");
    }
}

Результатом этой программы является "Bar-Execute - object", который для меня кажется немного странным, поскольку более конкретная перегрузка доступна через наследуемый интерфейс IFoo. Может ли кто-нибудь объяснить это поведение?

С наилучшими пожеланиями

Бернхард Рихтер

Теги:
inheritance
interface
clr

1 ответ

3
Лучший ответ

Я думаю, что в этом блоге вы можете найти объяснение: http://csharpindepth.com/Articles/General/Overloading.aspx

Когда компилятор идет искать перегрузки метода экземпляра, он рассматривает класс времени компиляции "цель" вызова и просматривает методы, объявленные там. Если он не может найти что-либо подходящее, он затем смотрит на родительский класс... затем класс grandparent и т.д. Это означает, что если на разных уровнях иерархии есть два метода, то "более глубокий" будет выбран первым, даже если это не "лучший член функции" для вызова.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню