gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:34:16 28 4
gpt4 key购买 nike

我的目的是重用从 ComboBox 类继承的 SelectedValueChanged 事件(该事件又从 ListControl 类继承)

在下面的代码中:SelectedValueChanged 标记有屏幕截图中显示的编译器错误。我不打算隐藏继承的事件,因此我不想使用new关键字。我希望从 DRT_ComboBox_Abstract 派生的类能够按原样使用继承的事件。

如何使用从基类继承的事件定义 EventHandler? (或者,我在理解事件方面完全脱离了这个星球吗?)

注意:“显示潜在修复”将 公共(public)事件 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);
}
}
}

最佳答案

您无需再次声明该事件。如果它是公共(public)的并且在需要时已经被抛出,您可以根据需要通过订阅基类事件来处理更改。

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

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 方法只是为了简化代码。这超出了本主题的范围

希望对您有所帮助。

关于c# - 如何使用从基类继承的事件在抽象类中定义 EventHandler?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50455282/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com