На этом шаге мы рассмотрим пример класса с индексатором, индекс которого не является целым числом.
В следующем примере описывается класс с индексатором, индекс которого не является целым числом. Соответствующая программа представлена ниже.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace pr131_1 { // Класс с индексатором: class MyClass { // Целочисленное поле: public int code; // Конструктор с одним аргументом: public MyClass(int n) { code = n; } // Целочисленный индексатор с индексом, который является // объектом класса MyClass: public int this[MyClass obj] { // Метод вызывается при считывании значения // выражения с проиндексированным объектом: get { // Результат: return code - obj.code; } // Метод вызывается при присваивании значения // выражению с проиндексированным объектом: set { // Присваивается значение полю: code = obj.code + value; } } } // Класс с главным методом: class Program { // Главный метод: static void Main() { // Создание объекта: MyClass A = new MyClass(100); // Проверка значения поля объекта: Console.WriteLine("Объект A: {0}", A.code); // Создание объекта: MyClass B = new MyClass(150); // Проверка значения поля объекта: Console.WriteLine("Объект В: {0}", B.code); // Использование индексатора: int num = A[B]; Console.WriteLine("Выражение A[B]={0}", num); Console.WriteLine("Выражение В[A]={0}", B[A]); A[B] = 200; // Проверка значения поля объекта: Console.WriteLine("Объект А: {0}", A.code); // Задержка: Console.ReadLine(); } } }
Результат выполнения программы такой.
Рис.1. Результат выполнения программы
Здесь мы описываем класс MyClass, у которого есть открытое целочисленное поле code, конструктор с одним аргументом и индексатор. Тип индексатора определяется ключевым словом int, а вот индекс в индексаторе описан как MyClass obj. Аксессоры индексатора описаны так, что результатом выражения вида А[В], в котором А и В являются объектами класса MyClass, является разность значений поля code объекта А и объекта В. Например, если поле code объекта А равно 100, а поле code объекта В равно 150, то результатом выражения А[В] будет -50 (разность значений 100 и 150). Значение выражения B[А] при этом равно 50 (разность значений 150 и 100). Если выражению вида А[В] присваивается целочисленное значение, то поле code объекта А получит новое значение, которое равно сумме значения поля code объекта В и значения, присваиваемого выражению А[В]. Так, при значении поля code объекта В равном 150 в результате выполнения команды
A[B] = 200;
На следующем шаге мы рассмотрим двумерные индексаторы.