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

  public void Reset() {

    val = start;

  }

  public void SetStart(T v) {

    start = v;

    val = start;

  }

}

class ThreeD {

  public int x, y, z;

  public ThreeD(int a, int b, int c) {

    x = a;

    y = b;

    z = c;

  }

}

class GenIntfDemo {

  // Определить метод увеличения на два каждого

  // последующего значения типа int.

  static int IntPlusTwo(int v) {

    return v + 2;

  }

  // Определить метод увеличения на два каждого

  // последующего значения типа double.

  static double DoublePlusTwo(double v) {

    return v + 2.0;

  }

  // Определить метод увеличения на два каждого

  // последующего значения координат объекта типа ThreeD.

  static ThreeD ThreeDPlusTwo(ThreeD v) {

    if(v==null) return new ThreeD(0, 0, 0);

    else return new ThreeD(v.x + 2, v.y + 2, v.z + 2);

  }

  static void Main() {

    // Продемонстрировать генерирование

    // последовательного ряда значений типа int.

    ByTwos intBT = new ByTwos(IntPlusTwo);

    for(int i=0; i < 5; i++)

      Console.Write(intBT.GetNext() + "  ");

    Console.WriteLine();

    // Продемонстрировать генерирование

    // последовательного ряда значений типа double.

    ByTwos dblBT = new ByTwos(DoublePlusTwo);

    dblBT.SetStart(11.4);

    for(int i=0; i < 5; i++)

      Console.Write(dblBT.GetNext() + "  ");

    Console.WriteLine();

    // Продемонстрировать генерирование последовательного ряда

    // значений координат объекта типа ThreeD.

    ByTwos ThrDBT = new ByTwos(ThreeDPlusTwo);

    ThreeD coord;

    for(int i=0; i < 5; i++) {

      coord = ThrDBT.GetNext();

      Console.Write(coord.x + "," +

                    coord.y + "," +

                    coord.z + "  ");

    }

    Console.WriteLine();

  }

}

Этот код выдает следующий результат.

2 4 6 8 10

13.4 15.4 17.4 19.4 21.4

0,0,0 2,2,2 4,4,4 6,6,6 8,8,8

В данном примере кода имеется ряд любопытных моментов. Прежде всего обратите внимание на объявление интерфейса ISeries в следующей строке кода.

public interface ISeries {

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

А теперь обратите внимание на следующее объявление класса ByTwos, реализующего интерфейс ISeries.

class ByTwos : ISeries {

Параметр типа Т указывается не только при объявлении класса ByTwos, но и при объявлении интерфейса ISeries. И это очень важно. Ведь класс, реализующий обобщенный вариант интерфейса, сам должен быть обобщенным. Так, приведенное ниже объявление недопустимо, поскольку параметр типа Т не определен.

class ByTwos : ISeries { // Неверно!

Аргумент типа, требующийся для интерфейса ISeries, должен быть передан классу ByTwos. В противном случае интерфейс никак не сможет получить аргумент типа.

Далее переменные, хранящие текущее значение в последовательном ряду (val) и его начальное значение (start), объявляются как объекты обобщенного типа Т. После этого объявляется делегат IncByTwo. Этот делегат определяет форму метода, используемого для увеличения на два значения, хранящегося в объекте типа Т. Для того чтобы в классе ByTwos могли обрабатываться данные любого типа, необходимо каким-то образом определить порядок увеличения на два значения каждого типа данных. Для этого конструктору класса ByTwos передается ссылка на метод, выполняющий увеличение на два. Эта ссылка хранится в переменной экземпляра делегата incr. Когда требуется сгенерировать следующий элемент в последовательном ряду, этот метод вызывается с помощью делегата incr.

А теперь обратите внимание на класс ThreeD. В этом классе инкапсулируются координаты трехмерного пространства (X,Z,Y). Его назначение — продемонстрировать обработку данных типа класса в классе ByTwos.

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

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

1001 совет по обустройству компьютера
1001 совет по обустройству компьютера

В книге собраны и обобщены советы по решению различных проблем, которые рано или поздно возникают при эксплуатации как экономичных нетбуков, так и современных настольных моделей. Все приведенные рецепты опробованы на практике и разбиты по темам: аппаратные средства персональных компьютеров, компьютерные сети и подключение к Интернету, установка, настройка и ремонт ОС Windows, работа в Интернете, защита от вирусов. Рассмотрены не только готовые решения внезапно возникающих проблем, но и ответы на многие вопросы, которые возникают еще до покупки компьютера. Приведен необходимый минимум технических сведений, позволяющий принять осознанное решение.Компакт-диск прилагается только к печатному изданию книги.

Юрий Всеволодович Ревич

Программирование, программы, базы данных / Интернет / Компьютерное «железо» / ОС и Сети / Программное обеспечение / Книги по IT
Adobe InDesign CS3
Adobe InDesign CS3

Книга посвящена верстке и макетированию в программе Adobe InDesign CS3. Помимо того что в ней описываются возможности программы, рассматриваются также принципы и традиции верстки, приводятся примеры решения типичных задач. Все это позволит читателю не только овладеть богатым инструментарием программы, но и грамотно применять его.Материал книги разделен на логические части: теоретические сведения, инструментарий программы, решение задач, – а также рассчитан на два уровня подготовки читателей – начинающих и опытных пользователей, что выгодно отличает книгу от других изданий. Это позволит применять ее как новичкам для знакомства с программой, так и пользователям со стажем для пополнения своих знаний.

Владимир Гавриилович Завгородний , Владимир Завгородний

Программирование, программы, базы данных / Программное обеспечение / Книги по IT
Разработка приложений в среде Linux. Второе издание
Разработка приложений в среде Linux. Второе издание

Книга известных профессионалов в области разработки коммерческих приложений в Linux представляет СЃРѕР±РѕР№ отличный справочник для широкого круга программистов в Linux, а также тех разработчиков на языке С, которые перешли в среду Linux из РґСЂСѓРіРёС… операционных систем. РџРѕРґСЂРѕР±но рассматриваются концепции, лежащие в основе процесса создания системных приложений, а также разнообразные доступные инструменты и библиотеки. Среди рассматриваемых в книге вопросов можно выделить анализ особенностей применения лицензий GNU, использование СЃРІРѕР±одно распространяемых компиляторов и библиотек, системное программирование для Linux, а также написание и отладка собственных переносимых библиотек. Р

Майкл К. Джонсон , Эрик В. Троан

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