Как обстоят дела с Visual Inheritance

У нас есть приложение, которое должно быть гибким в том, как оно отображает свою основную форму пользователю - в зависимости от пользователя форма должна немного отличаться, может быть, дополнительная кнопка здесь или там, или какой-то другой нюанс. Чтобы перестать писать код для явного удаления или добавления элементов управления и т. д., я обратился к визуальному наследованию для решения проблемы — в том, что я считал аккуратным, чистым и логичным стилем объектно-ориентированного программирования — оказалось, что в половине случаев унаследованные формы испытывают трудности. рендеринг себя в VS без уважительной причины и т. д. - и у меня такое чувство, что разработчики и в некоторой степени Microsoft избегают практики визуального наследования - можете ли вы подтвердить это, я что-то здесь упустил?

С Уважением.


person Vidar    schedule 08.09.2008    source источник


Ответы (6)


Я думал, что в 2005 году они более или менее разобрались с проблемами дизайнера рабочего стола. Пробовали ли вы обычных виновников?

  • Нет абстрактных типов управления
  • Нет аргументов конструктора в любой форме
  • Инициализация перенесена в Form_Load, а не в Ctor.
  • Нет элементов управления в том же проекте, что и пользовательский элемент управления/форма, в который они помещены.
  • Закрыть все документы -> Очистить -> Восстановить
  • Перезапустить ВС

Я, кажется, думал, что пока вы делаете все вышеперечисленное, это работает... в основном.

person Quibblesome    schedule 08.09.2008
comment
Нет элементов управления в том же проекте, что и пользовательский элемент управления/форма, в который они помещены. Правда? Я делаю это все время. Никогда не было проблем... - person Niki; 29.01.2010
comment
Была большая проблема в VS2003. Вот когда конструктор был слегка дрянью. :) - person Quibblesome; 29.01.2010

Я учусь в направлении MCAD (по общему признанию, скоро устаревающего), и частью элемента WinForms было Visual Inheritance.

У меня лично не было серьезных проблем с этим, однако есть соображения, которые следует принять во внимание.

Для меня основной проблемой всегда является инициализация.. Вы должны помнить, что дизайнер не может/не создает экземпляры форм так же, как он это делает во время выполнения (аналогично, он не может делать это с веб-разработкой). , поэтому необходимо соблюдать осторожность при отрисовке пользовательского элемента управления).

Кроме того, после изменения формы требуется полная пересборка проекта, чтобы распространить изменения формы на дочерние формы, которые унаследованы от нее.

Я лично не видел никаких доказательств того, что его «избегали». Насколько мне известно, по-прежнему рекомендуется повторно использовать код там, где это возможно. Визуальное наследование обеспечивает это.

Могу ли я предложить создать новый вопрос с указанием фактических проблем, с которыми вы столкнулись, с примером кода? Затем мы можем посмотреть на это, чтобы увидеть, сможем ли мы заставить его работать, и объяснить, почему :)

person Rob Cooper    schedule 08.09.2008

Я видел некоторые проблемы в VS2005 с этим. В основном они возникали из-за проблем с построением форм-объектов в дизайнере. Были проблемы с кодом, который пытался получить доступ к базе данных из конструкторов форм и т. д.

Вы можете отлаживать подобные проблемы, запустив второй экземпляр Visual Studio и загрузив первый экземпляр в отладчике. Если вы устанавливаете точки останова в своем коде, вы можете отлаживать то, что происходит в дизайнерах в первую очередь.

Еще одна проблема, которую я помню, это дженерики в классах форм.

public class MyForm<MyObject> : Form

это не сработает

person Mendelt    schedule 08.09.2008

Я часто сталкиваюсь с такими проблемами в Visual Studio. Во многих случаях конструктор форм MSVS не может правильно отобразить форму. В те дни, когда я работал с WinForms, мне приходилось делать всевозможные странные трюки, чтобы включить некоторые сложные сценарии. Однако я думаю, что использование визуального наследования очень полезно, и его не следует выбрасывать, несмотря на ошибки дизайнера MSVS.

person aku    schedule 08.09.2008

Кажется, я нашел способ избежать этой проблемы.

Не перехватывайте событие Form_Load в родительской форме, это сломает дизайнер.

Также не удаляйте пустой конструктор по умолчанию из Visual Studio в родительской форме. Если вы хотите иметь внедрение зависимостей, создайте еще один конструктор.

Нравится:

public ProductDetail()
{
    InitializeComponent();
}

public ProductDetail(ISupplierController supplierController) : base()
{
    InitializeComponent();
    this.supplierController = supplierController;
}

Затем вы все равно можете сделать это из унаследованной формы:

public NewProduct(ISupplierController supplierController)
    : base(supplierController)
{
    InitializeComponent();
}

Это работало для меня до сих пор, и у меня тоже были некоторые странные проблемы с дизайнером.

привет, Даниэль

person Tigraine    schedule 03.11.2008
comment
Изменить: InitializeComponent(); также должен вызываться из нового конструктора, чтобы это работало. - person Tigraine; 03.11.2008

Прочитайте это: http://cs.rthand.com/blogs/blog_with_righthand/archive/2005/11/10/186.aspx

Насколько я знаю, все еще есть проблемы с визуальным наследованием и объектами, которые полагаются на коллекции для элементов дизайна, обычно элементы управления сеткой и т. д. Я полагаю, что MS все еще удалила возможность изменения f.ex. GridView в унаследованной форме/usercontrol и т. д. Но другие элементы управления, такие как TextBox, Form, UserControl, Panel и т. д., должны работать должным образом.

До сих пор у меня не было проблем с VI, использующим элементы управления сеткой сторонних производителей, но вы должны быть осторожны, в частности, НЕОБХОДИМО избегать удаления элементов из коллекций.

person Trygve Lorentzen    schedule 29.01.2010