class ByTwos : ISeries {

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

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

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

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

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

Далее в классеGenlntf Demoобъявляются три метода увеличения на два для объектов типаint, doubleиThreeD.Все эти методы передаются конструктору классаByTwosпри создании объектов соответствующих типов. Обратите особое внимание на приведенный ниже методThreeDPlusTwo ().

// Определить метод увеличения на два каждого // последующего значения координат объекта типа 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);

}

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

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