Далее переменные, хранящие текущее значение в последовательном ряду(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 +
}
В этом методе сначала проверяется, содержит ли переменная экземпляраvпустое значение(null).Если она содержит это значение, то метод возвращает новый объект типаThreeDсо всеми обнуленными полями координат. Ведь дело в том, что переменнойvпо умолчанию присваивается значение типаdefault (Т)в конструкторе классаByTwos.Это значение оказывается по умолчанию нулевым для типов значений и пустым для типов ссылок на объекты. Поэтому если предварительно не был вызван методSetStart,TOперед первым увеличением на два переменнаяvбудет содержать пустое значение вместо ссылки на объект. Это означает, что для первого увеличения на два требуется новый объект.
На параметр типа в обобщенном интерфейсе могут накладываться ограничения таким же образом, как и в обобщенном классе. В качестве примера ниже приведен вариант объявления интерфейсаISeriesс ограничением на использование только ссылочных типов.
public interface ISeries