Класс, реализующий два интерфейса, которые определяют один и тот же метод - PullRequest
3 голосов
/ 09 января 2011
//inteface i11 
 public interface i11
    {
        void m11();
    }
//interface i22
    public interface i22
    {
         void m11();
    }

//class ab implements interfaces i11 and i22
    public class ab : i11, i22
    {
        public void m11()
        {
            Console.WriteLine("class");
        }
    }

теперь, когда в методе Main () мы создаем объект класса ab, метод интерфейса которого будет вызван, объясните все.

Ответы [ 4 ]

9 голосов
/ 09 января 2011

Существует только одна реализация метода, поэтому она вызывается независимо от типа ссылки. I.E.:

i11 o = new ab();
o.m11();

и

i22 o = new ab();
o.m11();

фактически одинаковы.

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

4 голосов
/ 09 января 2011

Интерфейсы просто говорят: «Все, что реализует этот интерфейс, может быть уверенно иметь эти методы».
Если вы подумаете об этом в этом контексте, вы увидите, что он не вызывает метод интерфейса;скорее он просто реализует требуемые вызовы методов.

4 голосов
/ 09 января 2011

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

Предположим, у нас есть интерфейс с именем IBank. Этот интерфейс имеет следующее определение:

IBank
{
    void AddMoney(int amount);
    void RemoveMoney(int amount);
    int GetBalance();
}

Тогда у нас есть конкретная реализация этого интерфейса следующим образом:

EuroBank : IBank
{
    void AddMoney(int amount){ balance+= amount; }
    void RemoveMoney(int amount){ balance-= amount; }
    int GetBalance(){ return balance; }
    private int balance;
}

Я не могу создать новый экземпляр IBank. Следующий код не скомпилируется.

IBank bank = new IBank;

Вместо этого я должен создать новый конкретный экземпляр банка, который я могу рассматривать как IBank. Затем я могу вызвать методы этого класса.

IBank bank = new EuroBank;
bank.AddMoney(7);

Поэтому, когда я вызываю AddMoney, я использую метод, определенный интерфейсом, но на самом деле я вызываю конкретную реализацию AddMoney в классе EuroBank.

Итак, в вашем примере вы вызываете метод m11 класса ab. Однако ab реализует как i11, так и i22. Следовательно, он может рассматриваться как объект i11 и i22. Обе следующие строки кода будут работать.

i11 first = new ab();
i22 second = new ab();

Я могу вызвать метод m11 для любого объекта, но он всегда будет использовать конкретную реализацию метода, найденного для объекта ab.

0 голосов
/ 09 января 2011

Метод не является интерфейсным методом.
Будет вызван метод m11 класса ab.

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