Почему события не переопределяются так же, как свойства? - PullRequest
1 голос
/ 21 июня 2019

Это не относится к какому-либо реальному коду, это просто любопытство ...

Я играл с C # и наткнулся на это:

using System;

public class Program
{
    public class A
    {
        protected bool boolean;
        public virtual bool Boolean { get { return boolean; } set { boolean = value; Console.WriteLine("AB"); } }

        public virtual event Action action;

        public A()
        {
            action += () => Console.WriteLine("AA");
        }
    }

    public class B : A
    {
        public override bool Boolean { get { return boolean; } set { boolean = value; Console.WriteLine("BB"); } }

        public override event Action action;

        public B() : base()
        {
            action += () => Console.WriteLine("BA");
        }

        public void Invoke()
        {
            action.Invoke();
        }
    }

    public static void Main()
    {
        B b = new B();

        b.Boolean = false;
        b.Invoke();
    }
}

Письменные строки:

BB
AA
BA

Я ожидал, что только ББ и БА появятся ...

Почему события переопределяются по-другому?

Поскольку события - это просто свойства типа делегата, и «add» / «remove», похоже, работают так же, как и любой другой метод доступа, я ожидал, что они будут переопределены так же, как «get» / «set» из обычного свойства.

1 Ответ

0 голосов
/ 21 июня 2019

Диспетчеры событий могут иметь более одного прикрепленного делегата.

Переменная action установлена ​​в конструкторе B, который вызывает конструктор для базового класса A, обратите внимание на : base в public B() : base();таким образом добавляя второй обработчик, дающий вывод «AA».

...