public interface IB : IA {
void Meth3();
}
// В этом классе должны быть реализованы
//все методы интерфейсов IA и IB.
class MyClass : IB {
public void Meth1() {
Console.WriteLine("Реализовать метод Meth1().");
}
public void Meth2() {
Console.WriteLine("Реализовать метод Meth2().");
}
public void Meth3() {
Console.WriteLine("Реализовать метод Meth3().");
}
}
class IFExtend {
static void Main() {
MyClass ob = new MyClass();
ob.Meth1();
ob.Meth2();
ob.Meth3();
}
}
Ради интереса попробуйте удалить реализацию метода Meth1()из класса MyClass. Это приведет к ошибке во время компиляции. Как пояснялось ранее, в любом классе, реализующем интерфейс, должны быть реализованы все методы, определенные в этом интерфейсе, в том числе и те, что наследуются из других интерфейсов.
Сокрытие имен при наследовании интерфейсов
Когда один интерфейс наследует другой, то в производном интерфейсе может быть объявлен член, скрывающий член с аналогичным именем в базовом интерфейсе. Такое сокрытие имен происходит в том случае, если член в производном интерфейсе объявляется таким же образом, как и в базовом интерфейсе. Но если не указать в объявлении члена производного интерфейса ключевое слово new, то компилятор выдаст соответствующее предупреждающее сообщение.
При реализации члена интерфейса имеется возможность указать его имя полностью вместе с именем самого интерфейса. В этом случае получается явная реализация члена интерфейса , или просто явная реализация. Так, если объявлен интерфейс IMyIF
interface IMyIF {
int MyMeth(int x) ;
}
то следующая его реализация считается вполне допустимой:
class MyClass : IMyIF {
int IMyIF.MyMeth(int x) {
return x / 3;
}
}
Как видите, при реализации члена MyMeth()интерфейса IMyIFуказывается его полное имя, включающее в себя имя его интерфейса.
Для явной реализации интерфейсного метода могут быть две причины. Во-первых, когда интерфейсный метод реализуется с указанием его полного имени, то такой метод оказывается доступным не посредством объектов класса, реализующего данный интерфейс, а по интерфейсной ссылке. Следовательно, явная реализация позволяет реализовать интерфейсный метод таким образом, чтобы он не стал открытым членом класса, предоставляющего его реализацию. И во-вторых, в одном классе могут быть реализованы два интерфейса с методами, объявленными с одинаковыми именами и сигнатурами. Но неоднозначность в данном случае устраняется благодаря указанию в именах этих методов их соответствующих интерфейсов. Рассмотрим каждую из этих двух возможностей явной реализации на конкретных примерах.
В приведенном ниже примере программы демонстрируется интерфейс 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(x);
}
}
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 недоступен
Читать дальше