2008-12-09 43 views
1
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(); 
     } 
    } 

} 

如果滿足條件,我想觸發子事件。但是,如果我不需要調用基地的其他條件,因爲我的activatecontrols()在Parent中是私有的。那麼,我怎麼稱呼這個事件呢?有選擇地在C中發生火災事件#

回答

2

一個非常簡單的解決方案是在Parent上創建ActivateControls受保護的虛擬並在子級上覆蓋它,然後如果不是Check.Checked,則可以在child方法中調用base.activatecontrols。

+0

西蒙,添加代碼,你會得到+1 :) – 2008-12-09 01:13:15

+0

我看到布萊恩已經做到了。當時我正想要我的寶寶開始大吼大叫,讓他睡覺,我想「有人會因爲模糊的回答而投下我的票」。也希望PO也考慮一下。 – 2008-12-09 01:43:06

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 
}