我想要一個摘要UserControl
,BaseControl
,它實現了一個接口IBaseControl
。 然而,設置類抽象休息VisualStudio的設計(這是與Visual Studio(例如,參見this StackOverflow posting獲取更多信息),而據我所知,有no change expected in the near futureVisualStudio 2010 Designer引發實現的虛擬方法
於是,一個已知的問題來解決這個問題,我讓BaseControl
不是抽象的,其實現的IBaseControl
方法虛擬然而,由於這些方法並沒有什麼意義了BaseControl
(例如,不是所有組件都已經被添加),我讓他們扔:
public class BaseControl : UserControl, IBaseControl
{
/// <summary>
/// This IBaseControl method is not abstract because
/// that breaks the Designer
/// </summary>
public virtual void LoadSettings()
{
throw new NotImplementedException("Implement in derived class.");
}
private void BaseControl_Load(object sender, EventArgs e)
{
// intention: derived methods automagically load their settings
this.LoadSettings();
}
}
在導出的控件,我有相應的覆蓋:
public partial class DerivedControl : BaseControl
{
public override void LoadSettings()
{
// load settings
}
}
儘管如此,當我嘗試在設計器中打開控件時,出現一個錯誤,指示BaseControl.LoadSettings
引發了異常。
現在,請記住LoadSettings
是在基類中調用的,所以當Designer加載DerivedControl
時,它依次調用BaseControl
的加載方法,該方法會拋出。
您是否遇到過類似問題?你怎麼處理這件事?如果可能的話,我想有一個優雅的解決方案。
沒有repro,我沒有想到一個。現在工具欄上有兩個控件,不要選錯了。你應該重寫OnLoad而不是使用Load事件。 – 2011-06-09 20:53:54