BadCats
@BadCats

Переопределение virtual события?

всем привет, имеется такой пример:
public delegate void EventDelegate();

    interface IInterface
    {
        event EventDelegate MyEvent; // Абстрактное событие.
    }

    public class BaseClass : IInterface
    {
        EventDelegate myEvent = null;

        public virtual event EventDelegate MyEvent // Виртуальное событие.
        {
            add { myEvent += value; }
            remove { myEvent -= value; }
        }

        public void InvokeEvent()
        {
            myEvent.Invoke();
        }
    }

    public class DerivedClass : BaseClass
    {
        public override event EventDelegate MyEvent // Переопределенное событие.
        {
            add
            {
                base.MyEvent += value;
                Console.WriteLine("К событию базового класса был прикреплен обработчик - {0}", value.Method.Name);
            }
            remove
            {
                base.MyEvent -= value;
                Console.WriteLine("От события базового класса был откреплен обработчик - {0}", value.Method.Name);
            }
        }
    }

    class Program
    {
        // Методы обработчики события.

        static private void Handler1()
        {
            Console.WriteLine("Обработчик события 1");
        }

        static private void Handler2()
        {
            Console.WriteLine("Обработчик события 2");
        }

        static void Main()
        {
            DerivedClass instance = new DerivedClass();

            // Присоединение обработчиков событий.
            instance.MyEvent += new EventDelegate(Handler1);
            instance.MyEvent += new EventDelegate(Handler2);

            // Метод который вызывает событие.
            instance.InvokeEvent();

            Console.WriteLine(new string('-', 20));

            // Открепляем Handler2().
            instance.MyEvent -= new EventDelegate(Handler2);
            instance.InvokeEvent();

            // Delay.
            Console.ReadKey();
        }
    }

К данному примеру у меня три вопроса:

1)переопределение события с помощью virtual - также как и метод InvokeEvent в данном примере - позволяет классам наследникам вызывать событие путем переопределения?

2)Если у меня одно событие - можно ли подписывать при переопределении это одно событие на разные обработчики переопределяя его в разные классы - т.е я имею ввиду, если я одно виртуальное событие переопределил в три разных класса и в каждом из них подписал на разные обработчики событий, то если я затем создам экземпляр конкретного класса, то у меня сработают только обработчики из него , или из всех трех классов - т.к я переопределил одно событие в эти три класса?

3)также меня интересует эта строка:
event EventDelegate MyEvent; // Абстрактное событие.

- как видно из комментария, автор курса говорит, что это абстрактное событие, но как я понимаю, это не тоже самое, что и с ключевым словом abstract ? я имею ввиду, что если по сущности это было бы тоже самое , что и с ключевым словом abstract , то мы обязаны были бы его переопределить, на как видно, что мы этого не делаем. Так, что же подразумевается под понятием "абстрактное событие" ?
  • Вопрос задан
  • 205 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы