Наследование и вызов метода через экземпляр интерфейса - PullRequest
0 голосов
/ 15 июня 2011

Я читал "Язык программирования C #. 4-е издание" и нашел следующий пример кода:

interface I<T>
{
    void F();
}
class Base<U>: I<U>
{
    void I<U>.F() {...}
}
class Derived<U,V>: Base<U>, I<V>
{
void I<V>.F() {...}
}
...
I<int> x = new Derived<int,int>();
x.F();

Авторы утверждают, что после вызова x.F () будет вызван метод в Derived, поскольку

"Derived<int,int> effectively reimplements I<int>"

Я проверил с помощью компилятора C # 4.0 и обнаружил, что этот оператор фактически вызывает метод в Base. Можете ли вы объяснить такое поведение?

Заранее спасибо.

edit: вот рабочий код, используемый для проверки:

using System;

interface I<T>
{
    void F();
}

class Base<U>: I<U>
{
    void I<U>.F()
    {
        Console.WriteLine("F() in Base");
    }
}

class Derived<U,V>: Base<U>, I<V>
{
    void I<V>.F()
    {
        Console.WriteLine("F() in Derived");
    }
}

public class MainClass
{
    public static void Main()
    {
        I<int> x = new Derived<int,int>();
        x.F();
    }
}

Он выводит "F () в Base", поэтому я не знаю, где я не прав.

Ответы [ 2 ]

0 голосов
/ 15 июня 2011

void I<V>.F() {...} Метод может быть вызван / запущен из «Производного», но выполняет метод, определенный в интерфейсе.

void F();

0 голосов
/ 15 июня 2011

Потому что и базовый и производный интерфейс от меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...