Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Явные реализации





При реализации члена интерфейса имеется возможность указать его имя полностью вместе с именем самого интерфейса. В этом случае получается явная реализация члена интерфейса,или просто явная реализация.Так, если объявлен интерфейс IMyIF

interface IMyIF

{

int MyMeth(int x);

}

то следующая его реализация считается вполне допустимой:

class MyClass: IMyIF

{

int IMyIF.MyMeth(int x)

{

return x / 3;

}

}

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

В приведенном ниже примере программы демонстрируется интерфейс 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 o = this;// Интерфейсная ссылка на вызывающий объект

return!o.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 недоступен

// Но следующий код написан верно, поскольку в нем сначала создается

// интерфейсная ссылка типа IEven на объект класса MyClass, а затем по

// этой ссылке вызывается метод IsOdd().

IEven iRef = (IEven)ob;

result = iRef.IsOdd(3);

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

}

}

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

// Воспользоваться явной реализацией для устранения неоднозначности

using System;

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 FWIFNames

{

static void Main()

{

MyClass ob = new MyClass();

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

Анализируя приведенный выше пример программы, обратим прежде всего внимание на одинаковую сигнатуру метода Meth() в обоих интерфейсах, IMyIF_A и IMyIF_B. Когда оба этих интерфейса реализуются в классе MyClass, для каждого из них в отдельности это делается явно, т.е. с указанием полного имени метода Meth(). А поскольку явно реализованный метод может вызываться только по интерфейсной ссылке, то в классе MyClass создаются две такие ссылки: одна — для интерфейса IMyIF_A, а другая — для интерфейса IMyIF_B. Именно по этим ссылкам происходит обращение к объектам данного класса с целью вызвать методы соответствующих интерфейсов, благодаря чему и устраняется неоднозначность.







Date: 2015-09-02; view: 370; Нарушение авторских прав



mydocx.ru - 2015-2024 year. (0.008 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию