Есть композиция, есть разделение общей логики в отдельные реализации. Терпеть не могу бессмысленное наследование и abstract классы в шарпах. Я хз, каким нужно быть наркоманом, чтобы на постоянной основе их юзать у себя.
Это началось у меня с тех пор, как я начал много читать чужого кода. Постоянные скачки по вложенным реализациям, кривые тесты которые хз что тестируют. Ведь внутри поведение ещё от базовой реализации.