Читаем C# 4.0: полное руководство полностью

При реализации члена интерфейса имеется возможность указать его имя полностью вместе с именем самого интерфейса. В этом случае получается явная реализация члена интерфейса, или просто явная реализация. Так, если объявлен интерфейс 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 недоступен

    // Но следующий код написан верно,

    //поскольку в нем сначала создается

    // интерфейсная ссылка типа 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;

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных