Я хочу иметь резюме UserControl
, BaseControl
, которое реализует интерфейс IBaseControl
.
Тем не менее, установка класса для абстрактных разрывов VisualStudio дизайнер (Это известная проблема с Visual Studio (например, см. это сообщение StackOverflow для получения дополнительной информации), и, насколько я знаю, без изменений ожидается в ближайшее время
Итак, чтобы обойти это, я делаю 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
вызывается в базовом классе, поэтому, когда конструктор загружает DerivedControl
, он в свою очередь вызывает метод load для BaseControl
, который выдает.
Сталкивались ли вы с подобной проблемой? Как вы справились с этим? Я хотел бы иметь элегантное решение, если это возможно.