Раніше я використовував успадкування, щоб дозволити розширення форм Windows у своїй програмі. Якщо всі мої форми мали б загальні елементи управління, твори мистецтва та функціональність, я створив б базову форму, що реалізує загальні елементи керування та функціональні можливості, а потім дозволю іншим елементам управління успадковувати цю базову форму. Однак у мене виникли кілька проблем із цим дизайном.
Одночасно керування може бути в одному контейнері, тому будь-які статичні елементи керування будуть складними. Наприклад: Припустимо, у вас була базова форма під назвою BaseForm, яка містила TreeView, який ви створюєте захищеним та статичним, щоб усі інші (похідні) екземпляри цього класу могли змінювати та відображати той самий TreeView. Це не буде працювати для декількох класів, успадкованих від BaseForm, тому що TreeView може бути лише в одному контейнері одночасно. Ймовірно, це буде остання форма ініціалізована. Хоча кожен екземпляр міг редагувати елемент керування, він відображатиметься лише в одному в заданий час. Звичайно, є робочі місця, але всі вони некрасиві. (Це здається мені дуже поганим дизайном. Чому декілька контейнерів не можуть зберігати вказівники на один і той же об’єкт? Як би там не було.)
Стан між формами, тобто стану кнопок, текст мітки тощо, я повинен використовувати глобальні змінні для та скидання станів на Load.
Дизайнер Visual Studio не дуже добре підтримує це.
Чи є кращий, але все ще легко ретельний дизайн у використанні? Або успадкування форми все ще є найкращим підходом?
Оновлення Я перейшов від перегляду MVC до MVP до шаблона спостерігача до шаблону події. Ось що я зараз думаю, будь ласка, критикуйте:
Мій клас BaseForm міститиме лише елементи керування та події, пов'язані з цими елементами управління. Усі події, які потребують будь-якої логіки для їх оброблення, негайно перейдуть до класу BaseFormPresenter. Цей клас буде обробляти дані з інтерфейсу користувача, виконувати будь-які логічні операції, а потім оновлювати BaseFormModel. Модель буде виставляти події, які спричинятимуть зміни стану, класу Presenter, на який він підпишеться (або буде спостерігати). Коли Ведучий отримає сповіщення про подію, він виконає будь-яку логіку, і тоді Презентатор змінить Вигляд відповідно.
У пам’яті буде лише один клас кожного класу Model, але потенційно може бути багато примірників BaseForm і, отже, BaseFormPresenter. Це вирішило б мою проблему синхронізації кожного екземпляра BaseForm з тією ж моделлю даних.
Запитання:
На якому шарі слід зберігати такі речі, як остання натиснута кнопка, щоб я міг залишати її виділеною для користувача (як у меню CSS) між формами?
Будь ласка, критикуйте цей дизайн. Спасибі за вашу допомогу!