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