Язык программирования C#9 и платформа .NET5. Страница 237
using System;using SimpleDelegate;Console.WriteLine("***** Simple Delegate Example *****\n");// Делегаты могут также указывать на методы экземпляра.SimpleMath m = new SimpleMath();BinaryOp b = new BinaryOp(m.Add);// Вывести сведения об объекте.DisplayDelegateInfo(b);Console.WriteLine("10 + 10 is {0}", b(10, 10));Console.ReadLine();В данном случае вывод будет выглядеть следующим образом:
***** Simple Delegate Example *****Method Name: Int32 Add(Int32, Int32)Type Name: SimpleDelegate.SimpleMath10 + 10 is 20Отправка уведомлений о состоянии объекта с использованием делегатов
Очевидно, что предыдущий пример
SimpleDelegateCar1. Определить новый тип делегата, который будет использоваться для отправки уведомлений вызывающему коду.
2. Объявить переменную-член этого типа делегата в классе
Car3. Создать в классе
Car4. Реализовать метод
Accelerate()Для начала создайте новый проект консольного приложения по имени
CarDelegateCarusing System;using System.Linq;namespace CarDelegate{ public class Car { // Внутренние данные состояния. public int CurrentSpeed { get; set; } public int MaxSpeed { get; set; } = 100; public string PetName { get; set; } // Исправен ли автомобиль? private bool _carIsDead; // Конструкторы класса. public Car() {} public Car(string name, int maxSp, int currSp) { CurrentSpeed = currSp; MaxSpeed = maxSp; PetName = name; } }}А теперь модифицируйте его, выполнив первые три действия из числа указанных выше:
public class Car{ ...<b> // 1. Определить тип делегата.</b> public delegate void CarEngineHandler(string msgForCaller);<b> // 2. Определить переменную-член этого типа делегата.</b> private CarEngineHandler _listOfHandlers;<b> // 3. Добавить регистрационную функцию для вызывающего кода.</b> public void RegisterWithCarEngine(CarEngineHandler methodToCall) { _listOfHandlers = methodToCall; }}В приведенном примере обратите внимание на то, что типы делегатов определяются прямо внутри области действия класса
CarCarEngineHandlerstringvoidКроме того, была объявлена закрытая переменная-член делегата (
_listOfHandlersRegisterWithCarEngine()На заметку! Строго говоря, переменную-член типа делегата можно было бы определить как
publicprivateТеперь необходимо создать метод
Accelerate()Car<b>// 4. Реализовать метод Accelerate() для обращения к списку</b><b>// вызовов делегата в подходящих обстоятельствах.</b>public void Accelerate(int delta)