Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

делегат с эвентом и без - чем отличаются?

09.05.17 13:15
Re: делегат с эвентом и без - чем отличаются?
 
Программист коренной житель

Инкапсулации и безопасности :)


Простой пример:

class ClassA
{
    private ClassA () {}
    private static ClassA classA = null;
    public static ClassA Instance
    {
        get
        {
            if (classA != null)
               classA = new ClassA();
            return classA;
        }
    }
    public delegate void AAA ();
    public AAA OnAAA;
}
class ClassB
{
    public void Init ()
    {
        ClassA.Instance.OnAAA += AAA_Fired;
    }
    private void AAA_Fired ()
    {
        MakeAllPeopleHappy ();
    }
}
class ClassC
{
    public void Init ()
    {
        ClassA.Instance.OnAAA = AAA_Fired;
    }
    private void AAA_Fired ()
    {
        MakeAllPeopleRich ();
    }
}


И тут вожможны варианты :)

Если сделать так:

ClassB b = new ClassB ();
ClassC c = new ClassC ();
c.Init ();
b.Init ();


то все люди буду и богатыми и счастливыми, а если сделать так:

ClassB b = new ClassB ();
ClassC c = new ClassC ();
b.Init ();
c.Init ();


то все будут только богатыми :)


А ведь может еще случиться и так:

class ClassEvil
{
    public void Init ()
    {
        ClassA.Instance.OnAAA = AAA_Fired;
        ClassA.Instance.OnAAA ();
    }
    private void AAA_Fired ()
    {
        MakeAllPeopleIll ();
        MakeAllPeoplePoor ();
        MakeAllPeopleUnhappy ();
    }
}


Так что если ТС не хочет, чтобы ему вырвали руки, то пусть всегда использует event :D

 

Перейти на