шаблоны проектирования наследования

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

На мой взгляд, лучшим подходом был бы абстрактный класс между интерфейсом и реализацией компонента, который выполняет все общие функции (как в связанном здесь диаграмма классов) ... но правила наследования для C # позволяют мне иметь множественное наследование только от нереализованных интерфейсов. Каковы были бы лучшие практики для достижения такого поведения?


person tbischel    schedule 22.02.2010    source источник
comment
Значит, все компоненты должны быть одним классом, реализующим ваш пользовательский интерфейс, логику, и интерфейсы данных? Это совсем не похоже на хороший дизайн.   -  person Anon.    schedule 22.02.2010
comment
@Anon - я не думаю, что это то, о чем я говорю ... каждый компонент имеет свой уровень наследования, на котором реализован конкретный соответствующий интерфейс (см. Связанную картинку). Я новичок в этом типе разлуки, поэтому могу делать все неправильно.   -  person tbischel    schedule 22.02.2010
comment
Ваш пользовательский интерфейс не должен наследовать от вашей бизнес-логики (и наоборот).   -  person Anon.    schedule 22.02.2010
comment
Ссылка на изображение у меня не работала. Несмотря на это, @Anon верен, ваш пользовательский интерфейс не должен наследовать ничего от ваших данных или логики.   -  person IAbstract    schedule 22.02.2010


Ответы (2)


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

Таким образом вы можете наследовать каждый класс от соответствующего универсального класса.

Помните, что вам следует предпочесть композицию наследованию.

person Russell Giddings    schedule 22.02.2010
comment
Ах, в этом гораздо больше смысла. - person tbischel; 22.02.2010

Каждый (абстрактный класс и интерфейс) предлагает свой набор преимуществ и недостатков. Хотя Рассел прав, предлагая композицию вместо наследования, использование шаблонов предполагает программу для интерфейса, а не реализацию (шаблоны проектирования Head First).

Абстрактный класс предлагает массу гибкости, где вы можете реализовать методы под покровом, так сказать, принудительно реализовать реализацию и т. Д. Оба интерфейса предлагают полиморфизм, если это вызывает беспокойство. Но абстрактные классы занимают базовый слот наследования.

person IAbstract    schedule 22.02.2010