Шаг 131.
Язык программирования C#. Начала
Свойства и индексаторы. Использование индексаторов (окончание)

    На этом шаге мы рассмотрим пример класса с индексатором, индекс которого не является целым числом.

    В следующем примере описывается класс с индексатором, индекс которого не является целым числом. Соответствующая программа представлена ниже.

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;
поле code объекта А получит значение 350 (сумма значений 150 и 200).

    На следующем шаге мы рассмотрим двумерные индексаторы.




Предыдущий шаг Содержание Следующий шаг