В прошлом я использовал наследование, чтобы разрешить расширение форм Windows в моем приложении. Если бы все мои формы имели общие элементы управления, графические объекты и функции, я бы создал базовую форму, реализующую общие элементы управления и функции, а затем позволил бы другим элементам управления наследоваться от этой базовой формы. Однако я столкнулся с несколькими проблемами с этим дизайном.
Элементы управления могут находиться только в одном контейнере за раз, поэтому любые статические элементы управления будут хитрыми. Например: предположим, у вас есть базовая форма BaseForm, которая содержит TreeView, который вы делаете защищенным и статическим, чтобы все другие (производные) экземпляры этого класса могли изменять и отображать один и тот же TreeView. Это не будет работать для нескольких классов, наследуемых от BaseForm, потому что это TreeView может находиться только в одном контейнере за раз. Скорее всего, это будет в последней инициализированной форме. Хотя каждый экземпляр может редактировать элемент управления, он будет отображаться только по одному в данный момент времени. Конечно, есть обходные пути, но все они безобразны. (Мне кажется, это действительно плохой дизайн. Почему несколько контейнеров не могут хранить указатели на один и тот же объект? В любом случае, так оно и есть.)
Состояние между формами, то есть состояния кнопок, текст метки и т. Д., Я должен использовать глобальные переменные и сбросить состояния при загрузке.
Это не очень хорошо поддерживается дизайнером Visual Studio.
Есть ли лучший, но все же легко обслуживаемый дизайн? Или наследование форм все еще лучший подход?
Обновление Я перешел от просмотра MVC к MVP, к шаблону наблюдателя и к шаблону события. Вот что я думаю на данный момент, пожалуйста, критикуйте:
Мой класс BaseForm будет содержать только элементы управления и события, связанные с этими элементами управления. Все события, для обработки которых требуется какая-либо логика, немедленно передаются в класс BaseFormPresenter. Этот класс будет обрабатывать данные из пользовательского интерфейса, выполнять любые логические операции, а затем обновлять BaseFormModel. Модель будет предоставлять события, которые будут срабатывать при изменении состояния, для класса Presenter, на который она будет подписываться (или наблюдать). Когда докладчик получает уведомление о событии, он выполняет любую логику, а затем докладчик соответствующим образом изменяет представление.
В памяти будет только один из каждого класса Model, но потенциально может быть много экземпляров BaseForm и, следовательно, BaseFormPresenter. Это решило бы мою проблему синхронизации каждого экземпляра BaseForm с той же моделью данных.
Вопросов:
В каком слое должны храниться такие вещи, как последняя нажатая кнопка, чтобы я мог держать ее выделенной для пользователя (как в меню CSS) между формами?
Пожалуйста, критикуйте этот дизайн. Спасибо за вашу помощь!