Какой интерфейс будет реализован? - PullRequest
2 голосов
/ 12 сентября 2010

У меня вопрос по поводу интерфейса.Есть 2 интерфейса, оба содержат один и тот же метод Test ().Теперь я наследую оба интерфейса в классе Sample. Я хочу знать, какой метод интерфейса будет вызываться?Мой пример кода ниже:

interface IA 
{
    void Test();
}
interface IB
{
    void Test();
}
class Sample: IA, IB
{
    public void Test()
    {
      Console.WriteLine("Which interface will be implemented IA or IB???!");
    }
}
class Program
{
    public static void Main(string[] args)
    {
        Sample t = new Sample();
        t.Test();//Which Interface's Method will called.
        Console.ReadLine();
    }
}

Спасибо Vijendra Singh

Ответы [ 4 ]

12 голосов
/ 12 сентября 2010

Результат будет одинаковым для обоих. Если вы хотите различное поведение для интерфейса, вы должны явно реализовать их:

interface IA 
{
    void Test();
}
interface IB
{
    void Test();
}
class Sample: IA, IB
{
    void IA.Test()
    {
      Console.WriteLine("Hi from IA");
    }
    void IB.Test()
    {
      Console.WriteLine("Hi from IB");
    }
    public void Test() //default implementation
    {
      Console.WriteLine("Hi from Sample");
    }
}

class Program
{
    public static void Main(string[] args)
    {
        Sample t = new Sample();
        t.Test(); // "Hi from Sample"
        ((IA)t).Test(); // "Hi from IA"
        ((IB)t).Test(); // "Hi from IB"
        Console.ReadLine();
    }
}

Если вы хотите поведение по умолчанию, создайте метод с той же сигнатурой (таким образом, неявную реализацию интерфейса) и добавьте код для этого случая. Обычно вам просто нужна явная реализация.

9 голосов
/ 12 сентября 2010

Оба.

Если у вас есть код

IA a = new Sample();

или

IB b = new Sample();

, вывод такой же.

РЕДАКТИРОВАТЬ

Какой интерфейс называется?

Реализованы оба Нет .

Существуют интерфейсы, позволяющие программисту понять, чтоМетод (какой интерфейс) класса как.

Вам нужно использовать конкретную реализацию интерфейса.Методы из конкретного класса - это методы, которые вызываются.

3 голосов
/ 12 сентября 2010

Вы думаете об интерфейсе неправильно.Интерфейс не является реализацией, это абстракция.

Говоря компилятору, что Sample является как IA, так и IB, вы просто сказали, что он может быть приведен к любому из этих типов и обладает всей функциональностью.требуется делать то, что ожидает вызывающий код.

т.е.в следующем коде

Sample sample = new Sample();
sample.Test();
IA a = sample;
a.Test();
IB b = sample;
b.Test();

Он не вызывает три отдельных метода с именем Test, он вызывает метод Test из Sample каждый раз.Это в отличие от

object obj = sample;
obj.Test();

, который не сможет скомпилироваться, даже если у obj есть метод Test по своей природе типа Sample.

Это особенно полезно, когда вы смотрите на передачуобъект в качестве аргумента другого метода.

public void DoTest(IA a)
{
    a.Test();
}

Sample sample = new Sample();
DoTest(sample);

В этом случае компилятор знает только, что что-либо с контрактом IA имеет метод Test.Неважно, что это за тип, это дело вызывающего кода.

2 голосов
/ 12 сентября 2010

Вы непосредственно вызываете метод Sample.Test (), поскольку переменная "t" объявлена ​​как "Sample t"

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