}

}

Как видите, при реализации члена MyMeth () интерфейса IMylF указывается его полное имя, включающее в себя имя его интерфейса.

Для явной реализации интерфейсного метода могут быть две причины. Во-первых, когда интерфейсный метод реализуется с указанием его полного имени, то такой метод оказывается доступным не посредством объектов класса, реализующего данный интерфейс, а по интерфейсной ссылке. Следовательно, явная реализация позволяет реализовать интерфейсный метод таким образом, чтобы он не стал открытым членом класса, предоставляющего его реализацию. И во-вторых, в одном классе могут быть реализованы два интерфейса с методами, объявленными с одинаковыми именами и сигнатурами. Но неоднозначность в данном случае устраняется благодаря указанию в именах этих методов их соответствующих интерфейсов. Рассмотрим каждую из этих двух возможностей явной реализации на конкретных примерах.

В приведенном ниже примере программы демонстрируется интерфейс IEven, в котором объявляются два метода: IsEven () и IsOdd (). В первом из них определяется четность числа, а во втором его нечетность. Интерфейс IEven затем реализуется в классе MyClass. При этом метод IsOdd () реализуется явно.

// Реализовать член интерфейса явно, using System;

interface IEven { bool IsOdd(int x); bool IsEven(int x);

}

class MyClass : IEven {

// Явная реализация. Обратите внимание на то, что // этот член является закрытым по умолчанию, bool IEven.IsOdd(int x) { if((x%2)    !=    0)    return    true;

else return false;

}

// Обычная реализация, public bool IsEven(int x) {

IEven о = this; // Интерфейсная ссылка на вызывающий объект, return !о.IsOdd (х);

}

}

class Demo {

static void Main() {

MyClass ob = new MyClass(); bool result;

result = ob.IsEven (4);

if(result) Console.WriteLine('4 — четное число.');

// result = ob.IsOdd(4); // Ошибка, член IsOdd интерфейса IEven недоступен

// Но следующий код написан верно, поскольку в нем сначала создается // интерфейсная ссылка типа IEven на объект класса MyClass, а затем по // этой ссылке вызывается метод IsOdd ().

IEven iRef = (IEven) ob; result = iRef.IsOdd(3);

if(result) Console.WriteLine('3 — нечетное число.');

}

}

В приведенном выше примере метод IsOdd () реализуется явно, а значит, он недоступен как открытый член класса MyClass. Напротив, он доступен только по интерфейсной ссылке. Именно поэтому он вызывается посредством переменной о ссылочного типа IEven в реализации метода IsEven ().

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

interface IMyIF_A { int Meth(int x) ;

}

interface IMyIF_B { int Meth(int x) ;

}

// Оба интерфейса реализуются в классе MyClass. class MyClass : IMyIF_A, IMyIF_B {

// Реализовать оба метода Meth() явно, int IMyIF_A.Meth(int x) { return x + x;

}

int IMyIF_B.Meth(int x) { return x * x;

}

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

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

Отметить Добавить цитату