Делегат (Паттерн наблюдатель) - 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();
}
}
}