Вы можете создать общий интерфейс, который реализуют как IMammal
, так и IReptile
. Но на практике мы реже пишем код, который обрабатывает все эти вложенные типы. Это также может нарисовать вас в углу. Что-то потребуется общий метод, используемый млекопитающими и рептилиями, но он не будет совместим с каким-либо интерфейсом более низкого уровня.
Вместо этого попробуйте создать интерфейсы, такие как IMoveBehavior
, IEatBehavior
, IReproduceBehavior
и поместить различные варианты поведения в их собственные классы.
Таким образом, если вам нужна конкретная реализация IMoveBehavior
, вы можете использовать ее на любом типе животных, даже если он не имеет ничего общего с другими животными, которые используют это поведение.
Вы все еще можете использовать наследование. Возможно, вы «сочиняете» лягушку из разных форм поведения, и теперь вам нужны разные типы лягушек. У них может быть так много общего, что наследование имеет смысл. Но лучше начать с композиции, а затем посмотреть, появляется ли шаблон, в котором наследование приносит нам пользу. Если мы начнем с наследования, это может сбить нас с толку.