在C#中继承事件处理程序

时间:2020-03-06 14:20:12  来源:igfitidea点击:

我有点支持自己在这里的角落。

我有一系列从父级继承的UserControls,其中包含几个方法和事件以简化操作,因此我不必编写几行相同的代码。像你一样做。父级不包含其他控件。

我想做的是在父UserControl中只有一个事件处理程序,该事件处理程序执行仅父控件可以执行的操作(即,有条件地调用事件,如事件在父级中定义)。然后,我将此事件处理程序连接到子控件中的所有输入框,子控件将整理解析输入并告诉父控件是否引发该事件的任务。干净整洁,没有重复的复制粘贴代码(对我而言,这始终会导致错误)。

这是我的问题。 Visual Studio认为我太聪明了,并警告我"方法'CheckReadiness'(父级中的事件处理程序)不能作为事件的方法,因为该类派生的类已经定义了该方法。"是的,Visual Studio就是这样。我想拥有一个仅处理子类引发的事件的事件处理程序,其唯一的工作就是使我能够挂接子级而不必编写任何代码。我不需要那些额外的处理程序,因为子级处理用户输入时,我自然会调用我需要的所有功能。

我不确定为什么Visual Studio现在开始抱怨这件事(因为它让我以前做过),而且我不确定如何使它消失。最好是,我希望不必定义仅调用CheckReadiness的方法来执行此操作。是什么导致了此警告,又是什么导致了现在的警告,而不是在一小时前发出?如何在不使所有子类中都使用小处理程序的情况下使其消失?

解决方案

如果事件已在父类中定义,则无需在子类中再次重新连接它。这将导致事件触发两次。

请确保这是正在发生的事情。 HTH :)

有关MSDN的这篇文章应该是一个很好的起点:使用Visual Basic .NET覆盖事件处理程序。在"派生类"部分中,看看"句柄子句如何引起问题"。

为什么不在父类中将该方法声明为虚拟方法,然后可以在派生类中重写该方法以添加其他功能?

声明父方法为virtual,在子类中对其进行覆盖并调用

base.checkReadyness(sender, e);

(或者其派生)来自子类。如果我们想在调用父事件处理程序之前执行一些特定的错误检查代码,则可以进行将来的设计演变。我们可能不需要为每个控件编写像这样的数百万个事件处理程序,我们可以只编写一个,将所有控件挂接到该事件处理程序,然后依次调用父级的事件处理程序。

我注意到的一件事是,如果将所有这些代码都放在dll中,那么尝试从dll中调用事件处理程序时,我们可能会遇到性能下降的情况。

忘记这是一个事件处理程序,只在子类中进行适当的常规方法重写即可。

我也碰到过这一点,我同意感觉就像我们在正确地做所有事情。声明该方法为虚拟方法最多是一种解决方法,而不是解决方案。

正在执行的操作是仅存在于派生类中的控件有效,并且派生类将事件处理程序添加到该控件的事件之一。在基类中既没有定义处理事件的方法的事实,也没有在绑定中绑定该事件的方法。事件没有被添加两次或者类似的愚蠢行为,仅是处理事件的方法在何处定义的问题。

最肯定的是它不是一个虚拟方法,我不希望该方法被派生类覆盖。非常令人沮丧,我认为这是dev-studio中的错误。