Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSBasicCourse2ndedPodbelsky / CSBasicCourse2ndedPodbelsky.rtf
Скачиваний:
27
Добавлен:
22.03.2016
Размер:
11.9 Mб
Скачать

17.2. Массивы делегатов

Делегаты, точнее ссылки на экземпляры делегатов, можно объединять в

массивы. Такая возможность позволяет программисту задавать наборы действий,

которые затем будут автоматически выполнены в указанной последовательности.

В качестве примера рассмотрим модель перемещения робота по плоской

поверхности. Пусть робот умеет выполнять четыре команды (вперед, назад, направо,

налево), каждая из которых изменяет его положение на один шаг. Система

управления роботом должна формировать последовательность команд, которые

робот

выполняет

автоматически

.

После

выполнения

полученной

последовательности

команд

робот

должен

сообщить

о

достигнутом

местоположении. Конкретную последовательность можно формировать в вид

е

массива ссылок на экземпляры делегата. Перебор элементов массива позволит

выполнить всю цепочку команд.

Так как нашей целью является только иллюстрация возможностей массивов

делегатов "массивы делегатов" , то максимально упростим задачу. Определим класс

роботов Robot с четырьмя уже названными методами (командами) управления и

методом для выдачи информации о местоположении робота. Вне класса роботов

определим тип делегатов Steps, предназначенных для представления методов

управления роботом. В главной программе создадим объект класса роботов и

именующую его ссылку rob. Массив делегатов trace будем формировать, присваивая

его элементам ссылки на безымянные экземпляры делегата, адресующие разные

методы созданного объекта класса роботов. Этот массив будет имитировать

последовательность команд, управляющих перемещением конкретного объекта-

робота. После формирования массива переберем его элементы в цикле и с их

помощью последовательно вызовем все запланированные методы, управляющие

перемещением робота.

// 17_02.cs - массив делегатов

using System;

class Robot // класс для представления робота

{

Int X, y; // положение робота на плоскости

public void right() { x++; } // направо

public void left() { x--; } // налево

public void forward() { y++; } // вперед

public void backward() { y--; } // назад

public void position( ) // сообщить координаты

{ Console.WriteLine("The Robot position: x={0}, y={1}", x, y); }

}

delegate void Steps( ); // делегат-тип

class Program {

static void Main( ) {

Robot rob = new Robot(); // конкретный робот

Steps[] trace = { new Steps(rob.backward),

new Steps(rob.backward), new Steps(rob.left)};

for (int i = 0; i < trace.Length; i++)

{

Console.WriteLine("Method={0}, Target={1}",

trace[i].Method, trace[i].Target);

trace[i]();

}

rob.position(); // сообщить координаты

}

}

В цикле перебора элементов массива ссылок на экземпляры делегата (trace)

помещен вывод на консоль заголовка метода, адресованного очередным элементом

массива. Тут же выводится имя того класса, которому принадлежит этот

нестатический метод. Для получения заголовка и имени класса используются уже

упомянутые свойства класса делегатов (Method и Target).

Результат выполнения программы:

Method=Void backward(), Target=Robot

Method=Void backward(), Target=Robot

Method=Void left(), Target=Robot

The Robot position: x=-1, y=-2

При создании объекта класса Robot его координаты по умолчанию равны

нулю (x=0, y=0). Именно из этой точки начинается в нашем примере перемещение –

два шага назад и один влево.

Соседние файлы в папке CSBasicCourse2ndedPodbelsky