Я хочу иметь абстрактный UserControl
, BaseControl
, реализующий интерфейс IBaseControl
.
Однако установка абстрактного класса нарушает работу дизайнера VisualStudio (это известная проблема с Visual Studio (например, см. эту публикацию в StackOverflow для получения дополнительной информации), и, насколько мне известно, там нет изменений ожидается в ближайшем будущем
Итак, чтобы обойти это, я делаю BaseControl
не абстрактным, а его реализацию методов IBaseControl
виртуальными. Однако, поскольку эти методы не имеют смысла для a BaseControl
(например, еще не все компоненты добавлены), я заставляю их бросать:
public class BaseControl : UserControl, IBaseControl
{
///
/// This IBaseControl method is not abstract because
/// that breaks the Designer
///
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
, он, в свою очередь, вызывает метод загрузки для [11100 211] BaseControl , который выдает.
Сталкивались ли вы с подобной проблемой? Как вы с этим справились? Если возможно, мне бы хотелось найти элегантное решение.