Делегат (Паттерн наблюдатель) - C#
Формулировка задачи:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication55 { public delegate void Del(object o); class Subj { Del dels; public void Register(Del d) { dels += d; } public void OOPS() { Console.WriteLine("OOPS!"); if (dels != null) dels(this); } } class ObsA { public void Do(object o) { Console.WriteLine("Вижу, что OOPS!"); } } class ObsB { public static void See(object o) { Console.WriteLine("Я тоже вижу, что OOPS!"); } } class Program { static void Main(string[] args) { Subj s = new Subj(); ObsA o1 = new ObsA(); ObsA o2 = new ObsA(); s.Register(new Del(o1.Do)); s.Register(new Del(o2.Do)); s.Register(new Del(ObsB.See)); s.OOPS(); Console.ReadLine(); } } }
Решение задачи: «Делегат (Паттерн наблюдатель)»
textual
Листинг программы
using System; namespace ConsoleApplication55 { // Объявление сигнатуры делегата public delegate void Del(object o); class Subj { //ссылочная переменная типа дел Del Del dels; //оно вообще запускается? вы экземпляру ссылки на метод пытаетесь подписать //обраотчик события.... тут просто присвоить... public void Register(Del d) { dels += d; } //почитайте отличия делегата от метода... // если дел не пуст, выполнить... это не наблюдатель. наблюдатель должен события реализовать, а у вас лишь 1 ссылка на метод public void OOPS() { Console.WriteLine("OOPS!"); if (dels != null) dels(this); } } class ObsA { public void Do(object o) { Console.WriteLine("Вижу, что OOPS!"); } } class ObsB { public static void See(object o) { Console.WriteLine("Я тоже вижу, что OOPS!"); } } class Program { static void Main(string[] args) { Subj s = new Subj(); ObsA o1 = new ObsA(); ObsA o2 = new ObsA(); s.Register(new Del(o1.Do)); s.Register(new Del(o2.Do)); s.Register(new Del(ObsB.See)); s.OOPS(); Console.ReadLine(); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д