2010-12-06 2 views
1

Первый вопрос :)WinForms - Имитировать множественное наследование

В основном я хотел бы achief множественное наследование формы в проекте .NET WinForms.

Мы работаем с Framework, который имеет 2 базовых класса: UIForm и UIWizard. Мы (к сожалению) вынуждены использовать эти формы, чтобы начать наши собственные реализации.

Наверху мы построили следующую структуру: UIForm является суперклассом OurForm. UIWizard является суперклассом OurWizard. OurForm и OurWizard - почти близнецы.
OurForm само по себе является также суперкласс для других форм: OurCrudBase, OurListBase, OurSearchBase ...

Возможность
OurForm и OurWizard содержат «досье» о связанных свойств и методов, а это досье-контекст не относится к многим формам. Что еще хуже, в последнее время мы начали добавлять формы, которые имеют совершенно новые контексты: Существующее досье, но и клиент, статистика и т.д.

Так вот
Мы хотим, чтобы форма, которая является одновременно и CrudBase DossierBase. Или форма, которая представляет собой ListBase и ClientBase и т. Д. Чтобы добиться этого с помощью единого наследования, количество базовых форм будет взрываться (например, DossierBase + CrudBase + ListBase и т. Д. И т. Д.). Поэтому мы не хотим этого делать.

Решение
Мы рассматриваем удаление UIForm, говоря, что UIForm является фактически UIWizard, но только с «один шаг». Количество базовых классов уже было бы сокращено наполовину.

базовых классов на самом деле можно разделить на две категории
- Функциональная: Досье, клиент, статистика, ...
- технический: Crud, список, поиск ...

UIForm станет суперкласса либо технических, либо функциональных форм. Другой тип будет реализован как Стратегии.

Функциональные Производные классы:
+ форма может только возможно быть один из функциональных классов. Форма не может быть создана как для «статики», так и для «клиента». Таким образом, наследование имеет смысл здесь.
+ Возможна реализация технической функциональности как стратегии. Я думал о интерфейсе, который в основном имел метод для всего, что может произойти в форме: Load, Save, Closing, Closed, ...
- Взаимодействие между различными стратегиями, вероятно, было бы грязным. (То есть, убедившись, что когда вы положили оба списка и Crud к форме, что реализация не винт Афоризм)

Технические Производные классы:
+ Как-то у меня есть лучшее чувство с этим подходом. (Хотя я могу только перечислять отрицательные точки)
- Еще раз вам нужны дубликаты классов, если вы хотите объединить, например, List + Crud.Однако количество дублирования минимально.
- Для Клиента, Досье, Статистики нет общего основания. Поэтому превращение их в стратегию довольно сложно.

Я думаю, что я уже в значительной степени ответил на свой вопрос. Но согласны ли вы? Или вы думаете, что я слишком задумываюсь об этом, и должен ли я просто поместить столько, сколько приемлемо в суперклассах, и сделать как можно меньше наследования?
Или, возможно, совсем другой подход к решению проблемы?

Любая помощь будет оценена по достоинству!

Cheers,
Wouter

+0

Множественное наследование, возможно, является плохим. По моему опыту, наследование формы обычно очень плохое. Я не могу представить себе кошмар, чтобы было наследование нескольких форм ... – 2010-12-06 17:31:06

ответ

3

На основании вашего описания, я не совсем понимаю, почему вам нужно наследование вообще. Похоже, вам лучше использовать композицию вместо наследования.

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

+0

Спасибо! Я займусь этим. Краткая справка о наследовании и составе: http://stackoverflow.com/questions/49002/prefer-composition-over-inheritance – Laoujin 2010-12-06 17:31:47

Смежные вопросы