VisualStudio 2010 Designer добавляет реализованный виртуальный метод - PullRequest
6 голосов
/ 10 июня 2011

Я хочу иметь резюме 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, который выдает.

Сталкивались ли вы с подобной проблемой? Как вы справились с этим? Я хотел бы иметь элегантное решение, если это возможно.

1 Ответ

6 голосов
/ 10 июня 2011

Причина, по которой генерируется исключение, заключается в том, что, как ни странно, дизайнер не компилирует и не создает экземпляр класса, который вы разрабатываете вообще !Он только компилирует и создает экземпляр базового класса разрабатываемого вами элемента управления.

Почему это так, становится очевидным, когда вы понимаете, что добавление новых элементов управления в элемент потребует дальнейшей перекомпиляции.Кроме того, каждый добавляемый вами обработчик событий изменяет класс и снова потребует перекомпиляции.Так как обработчики событий никогда не будут вызываться в конструкторе, это все совершенно не нужно.Вы разрабатываете класс, который напоминает ваш класс, но не ваш класс;это работа в процессе.

Поскольку создается только базовый класс, базовый класс не может быть абстрактным, и он должен быть функциональным , как .Если вы бросаете исключения, то дизайнер их увидит.Единственное практическое решение - либо:

  • Не выбрасывать исключения из базового класса, либо
  • Условно не генерировать исключения в зависимости от того, является ли это временем разработки или нет.

Либо будет работать;используйте тот, который вы предпочитаете или лучше всего подходит для вашего дизайна.Именно так работает дизайнер, и, как вы упоминаете, он вряд ли изменится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...