c# - 在 C# 中有选择地触发事件

标签 c# events

class Child
{ 
    private override void Check_CheckedChanged(object sender, EventArgs e)
    {
        if (Check.Checked)
        {
            this.addName(this.FirstName);
            this.disableControls();
        }

        else
        {
            this.addAddress(this.address);
            //this.activatecontrols();// gives error since it's private method in parent.

        }
    }
}

class Parent
{
    private  void Check_CheckedChanged(object sender, EventArgs e)
    {
        if (Check.Checked)
        {
            this.disablecontrols();
        }

        else
        {
            this.addAddress(this.address);
            this.activatecontrols();
        }
    }

}

如果满足 if 条件,我想触发子事件。但如果不能,我需要调用 base 的 else 条件,因为我的 activatecontrols() 在 Parent 中是私有(private)的。那么,我该如何调用事件呢?

最佳答案

如果在派生类中需要ActivateControls的功能,可以在基类中将其设为protected

或者,您可以让 Check_CheckedChanged 事件处理程序调用基类中的 virtual 方法,该方法可以在派生类中被覆盖:

// Parent.cs

private void Check_CheckedChanged(object sender, EventArgs e)
{
    OnCheckedChanged();
}

protected virtual void OnCheckedChanged()
{
    if (Check.Checked)
    {
        this.disablecontrols();
    }
    else
    {
        this.addAddress(this.address);
        this.activatecontrols();
    }
}

Parent的逻辑不需要在Child中重复,这样可以简化handler:

// Child.cs

protected override void OnCheckedChanged()
{
    if (Check.Checked)
    {
        this.addName(this.FirstName);
    }

    base.OnCheckedChanged();  // Same outcome
}

关于c# - 在 C# 中有选择地触发事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/351473/

相关文章:

c# - 从不同线程更新对象的不同属性是否线程安全?

c# - 使接口(interface)实现异步

c# - 如何在c#中使用线程池和互斥锁?

c# - 如何处理触发事件中重叠的 Console.Writeline()?

javascript - jQuery:具有动态绑定(bind)、任意创建的事件和监听器的事件序列未完成

windows - 如何将新项目添加到 Windows 中文件夹和文件的右键单击事件?

c# - 如何测量函数运行了多长时间?

c# - 使用 IText 创建 Pdf 文档#

c# - 取消订阅处理程序中的事件总是安全的吗?

MySql 事件日期限制?