Делегаты. Разобраться на примере - C#

Узнай цену своей работы

Формулировка задачи:

Пытаюсь вкурить Троелсона с его разъяснением делегатов. У Шильдта все проще у Рихтера все сложнее. В общем есть по которому я уже прошелся с комментариями как мог, но ясность не пришла. Итак
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace delegateTroelson
  7. {
  8. //1. Создали класс в проекте delegateTroelson
  9. class Car
  10. {
  11. //2. Объявили поля
  12. public int CurrentSpeed { get; set; } //3.1. Описали свойства для полей
  13. public int MaxSpeed { get; set; } //3.2. Описали свойства для полей
  14. public string PetName { get; set; } //3.3. Описали свойства для полей
  15. private bool carIsDead; //3.4 булевая переменная (свойства не нужны)
  16. // 4.Описали конструкторы класса.
  17. public Car() { MaxSpeed = 100; } //4.1 Конструктор без параметров
  18. public Car(string name, int maxSp, int currSp)//4.2. Конструктор с параметрами
  19. {
  20. CurrentSpeed = currSp;
  21. MaxSpeed = maxSp;
  22. PetName = name;
  23. }
  24. // 5. Объявили тип делегата.
  25. public delegate void CarEngineHandler(string msgForCaller);//5.1. тип данного делегата принимает стринг возвращает void
  26. // 6. Определить переменную-член типа этого делегата.
  27. private CarEngineHandler listOfHandlers; //6.1. Данная переменная объявлена как privat чтобы защитить код извне(инкапсуляция)
  28. // 7. создали метод который через предоставить доступ к закрытой переменной listOfHandlers
  29. public void RegisterWithCarEngine(CarEngineHandler methodToCall) //7.1. Метод принимает как входной параметр член делегата
  30. {
  31. listOfHandlers = methodToCall;
  32. }
  33. //8. Реализовать метод Accelerate()-ускорение который принимает int
  34. public void Accelerate(int delta)
  35. {
  36. //8.1. Если этот автомобиль сломан, отправить сообщение об этом.
  37. if (carIsDead) //если carIsDead==true
  38. {
  39. if (listOfHandlers != null) //делаем проверку listOfHandlers
  40. listOfHandlers("Sorry, this car is dead...");
  41. }
  42. else
  43. {
  44. CurrentSpeed += delta; //в данном примере в Main объявлен класс с параметром с.CurrentSpeed=10 а
  45. //значение равно 20, то есть на первом проходе for в Main CurrentSpeed равна 30
  46. //макс скорость объявлена в конструкторе 100,
  47. if (10 == (MaxSpeed - CurrentSpeed) && listOfHandlers != null) //на первом проходе i-того условие не выполняется
  48. {
  49. listOfHandlers("Careful buddy! Gonna blow!"); //на 1-ой i-терации проходим дальше
  50. }
  51. if (CurrentSpeed >= MaxSpeed)
  52. //на первой i-терации CurrentSpeed=30 а MaxSpeed=100 условие не выполняется
  53. carIsDead = true;
  54. else
  55. //на первой итерации условие выполнилось, вывели на экран
  56. Console.WriteLine("CurrentSpeed= {0}", CurrentSpeed);
  57. }
  58. }
  59. }
  60. }
ну и MAIN
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace delegateTroelson
  7. {
  8. class Program
  9. {
  10. static void Main(string[] args)
  11. {
  12. Console.WriteLine("***** Delegates as event enablers *****\n");
  13. //9. создать объект Car.
  14. Car cl = new Car("SlugBug", 100, 10); //инициировали конструктором
  15. //вызываем метод RegisterWithCarEngine, по сути этот метод дает нам доступ к закрытой переменной
  16. //но как параметр этого метода мы передаем delegate, который соответствует сигнатуре void МЕТОД(string) объявленный в классе Main как OnCarEngineEvent
  17. cl.RegisterWithCarEngine(new Car.CarEngineHandler(OnCarEngineEvent)); //ПОЧЕМУ ДЕЛЕГАТ реализуется ЗДЕСЬ
  18. // Ускорить (это инициирует события).
  19. Console.WriteLine("***** Speeding up *****");
  20. for (int i = 0; i < 6; i++) //А ВЫПОЛНЯЕТСЯ ЗДЕСЬ???
  21. //на 5-ой итерации у меня отрабатывает метод OnCarEngineEvent
  22. cl.Accelerate(20);
  23. Console.ReadLine();
  24. }
  25. // Это цель для входящих сообщений.
  26. public static void OnCarEngineEvent(string msg)
  27. {
  28. Console.WriteLine("\n***** Message From Car Object *****");
  29. Console.WriteLine("=> {0}", msg);
  30. Console.WriteLine("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
  31. }
  32. }
  33. }
как это получается не понимаю когда у них проходит взаимосвязь??? если из метода мы вышли и в майне вошли в цикл

Решение задачи: «Делегаты. Разобраться на примере»

textual
Листинг программы
  1. private CarEngineHandler listOfHandlers;

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы