Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何重新实现继承事件处理程序?_C#_Event Handling - Fatal编程技术网

C# 如何重新实现继承事件处理程序?

C# 如何重新实现继承事件处理程序?,c#,event-handling,C#,Event Handling,类A中的buttonOK的单击事件有一个处理程序buttonOK\u click,我想在类B中使其无效,并为buttonOK添加一个新的单击事件处理程序 我可以将类A中的按钮的可访问性设置为受保护的,并使用new关键字将其隐藏在类B中吗?派生类不能“进入”基类并更改实现。最好的方法是在基类中使事件处理程序虚拟,然后在派生类中重写它。同意John的观点,使按钮单击事件虚拟应该是最好的选择 下面是一个例子 public class A : Form { buttonOK; } public cl

类A中的
buttonOK
的单击事件有一个处理程序
buttonOK\u click
,我想在类B中使其无效,并为
buttonOK
添加一个新的单击事件处理程序


我可以将类A中的
按钮的可访问性设置为
受保护的
,并使用
new
关键字将其隐藏在类B中吗?

派生类不能“进入”基类并更改实现。最好的方法是在基类中使事件处理程序
虚拟,然后在派生类中重写它。

同意John的观点,使按钮单击事件
虚拟应该是最好的选择

下面是一个例子

public class A : Form
{
  buttonOK;
}
public class B : A
{
}
使用“New”关键字将中断按钮点击事件的注册,因此您在B类中的按钮点击将不会执行。 两种常见做法是:

1将基类中的buttonOK_客户端声明为虚拟,并在派生类中重写它

2在基类中引入Validate虚函数,并在基类和派生类中提供不同的实现:

public partial class Base : Form
{
    public Base()
    {
        InitializeComponent();
    }

    protected virtual void button1_Click(object sender, EventArgs e)
    {
        MessageBox.Show("From Base");
    }
}

public class Derived: Base
{
    protected override void button1_Click(object sender, EventArgs e)
    {
        MessageBox.Show("From Derived");
    }
}
 public class A : Form
 {
    void buttonOK(...)
    {
        if (Validate())
        {
            //...
        }
    }

    virtual bool Validate()
    {
        //...
    }
 }
 public class B : A
 {
    override bool Validate()
    {
        //...
    }
 }