C#中有选择地触发事件

时间:2008-12-09 01:00:30

标签: 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();
        }
    }

}

如果满足条件,我想触发子事件。但是如果我不能调用base的else条件,因为我的activatecontrols()在Parent中是私有的。那么,我该怎么称呼这个事件呢?

2 个答案:

答案 0 :(得分:3)

如果您在派生类中需要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中重复,因此可以简化处理程序:

// Child.cs

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

    base.OnCheckedChanged();  // Same outcome
}

答案 1 :(得分:2)

一个非常简单的解决方案是在Parent上使ActivateControls受保护虚拟并在子节点上覆盖它,然后如果不是Check.Checked,你可以在子方法中调用base.activatecontrols。