如何使用从基类继承的事件在抽象类中定义EventHandler?

时间:2018-05-21 19:14:31

标签: c# inheritance events

我的意图是重用从SelectedValueChanged类继承的ComboBox事件(反过来,继承自ListControl类)

在下面的代码中:SelectedValueChanged被标记为屏幕截图中显示的编译器错误。我不打算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 :(得分:5)

您不需要再次申报该活动。如果它是公共的并且在需要时它已被抛出,则可以通过订阅基类事件来处理所需的更改。

我的意思是,你可以这样做:

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
        }
    }
}

SOLID类上(我相信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);
        }
    }
}

注意:我已经删除了Disable方法,只是为了简化代码。它超出了本主题范围

我希望它有所帮助。