Как определить EventHandler в абстрактном классе, используя событие, унаследованное от базового класса? - PullRequest
0 голосов
/ 21 мая 2018

Мое намерение состоит в том, чтобы повторно использовать событие SelectedValueChanged, унаследованное от класса ComboBox (которое, в свою очередь, наследует его от класса ListControl)

В приведенном ниже коде: SelectedValueChanged isотмечен ошибкой компилятора, показанной на снимке экрана.Я не намерен использовать hiding унаследованное событие, поэтому я не хочу использовать ключевое слово new.Я хочу, чтобы классы, производные от DRT_ComboBox_Abstract, могли использовать унаследованное событие как есть.

Как определить EventHandler, используя событие, унаследованное от базового класса?(Или я совершенно не в планете из-за понимания событий?)

Примечание: «Показать возможные исправления» окружает public event EventHandler SelectedValueChanged знаком #pragma warning disable CS0108, который просто отключает предупреждение.

снимок экрана enter image description here

using System;
using System.Windows.Forms;

namespace DRT
{
    internal abstract partial class DRT_ComboBox_Abstract : ComboBox
    {
        //SelectedValueChanged is tagged with the compiler error shown in the screenshot
        public event EventHandler SelectedValueChanged;

        public DRT_ComboBox_Abstract()
        {
            InitializeComponent();
        }

        public void Disable()
        {
            this.Enabled = false;
        }

        public void _OnSelectedValueChanged(object sender, System.EventArgs e)
        {
            this.SelectedValueChanged?.Invoke(sender, e);
        }
    }
}

1 Ответ

0 голосов
/ 21 мая 2018

Вам не нужно объявлять событие снова.Если оно общедоступное и оно уже выбрасывается, когда это необходимо, вы можете обработать изменения, если вам нужно, подписавшись на событие базового класса.

Я имею в виду, что вы можете сделать что-то вроде:

using System;
using System.Windows.Forms;

namespace DRT
{
    internal abstract partial class DRT_ComboBox_Abstract : ComboBox
    {
        public DRT_ComboBox_Abstract()
        {
            InitializeComponent();
            SelectedValueChanged += MyOwnHandler
        }

        protected virtual void MyOwnHandler(object sender, EventArgs args)
        {
            // Hmn.. now I know that the selection has changed and can so somethig from here
            // This method is acting like a simple client
        }
    }
}

On S O LID классов (я полагаю, что это так для ComboBox), часто метод, который эффективно вызывает абонентов для обработки какого-либо события, обычно является виртуальным, позволяя вам, как только вы наследуете от этого класса, перехватывать вызов обработчиков событий, если это то, что вы хотите.

Это:

using System;
using System.Windows.Forms;

namespace DRT
{
    internal abstract partial class DRT_ComboBox_Abstract : ComboBox
    {
        public DRT_ComboBox_Abstract()
        {
            InitializeComponent();
        }

        protected override void OnSelectedValueChanged(object sender, EventArgs args)
        {
            // Wait, the base class is attempting to notify the subscribers that Selected Value has Changed! Let me do something before that
            // This method is intercepting the event notification

            // Do stuff

            // Continue throwing the notification
            base.OnSelectedValueChanged(sender, args);
        }
    }
}

Примечание: IВы удалили метод Disable только для упрощения кода.Это выходит за рамки данной темы

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...