// Явная реализация. Обратите внимание на то, что // этот член является закрытым по умолчанию, 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;
}
// Вызывать метод Meth по интерфейсной ссылке. public int MethA(int x){
IMyIF_A a_ob; a_ob = this;
return a_ob.Meth(x); // вызов интерфейсного метода IMyIF_A
}
public int MethB(int x){
IMyIF_B b_ob; b_ob = this;
return b_ob.Meth(x); // вызов интерфейсного метода IMyIF_B
}
}
class FQIFNames {
static void Main {
MyClass ob = new MyClassO;
Console.Write("Вызов метода IMyIF_A.Meth: ");
Console.WriteLine(ob.MethA(3));
Console.Write("Вызов метода IMyIF_B.Meth: ");
Console.WriteLine(ob.MethB(3)) ;
}
}
Вот к какому результату приводит выполнение этой программы.
Вызов метода IMyIF_A.Meth: 6 Вызов метода IMyIF_B.Meth: 9