Делегат (Паттерн наблюдатель) - 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();
        }
    }
}
Что значит dels(this), а именно this (по идее ссылка должна быть)?

Решение задачи: «Делегат (Паттерн наблюдатель)»

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();
        }
    }
}

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


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

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

6   голосов , оценка 4.167 из 5