Общий метод для 2 интерфейсов - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть маленький вопрос о дизайне в C #.

У меня есть интерфейс IAnimal (с некоторыми методами). Затем у меня есть интерфейсы IMammal и IReptile (наследующие оба интерфейса IAnimal).

Что мне делать, если метод необходим для классов IMammal и IReptil?

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

Ответы [ 3 ]

0 голосов
/ 13 ноября 2018

У вас есть два варианта:

  1. Оба IMammal и IReptile реализуют IMammalReptile, который реализует себя IAnimal.Вы создаете дополнительный уровень в своей иерархии интерфейса.Это имеет смысл, когда вы думаете, что отношения вдоль линий IMammal являются IMammalReptile
  2. . Вы создаете третий интерфейс, который определяет желаемое поведение, и выполняете как IMammal, так иIReptile реализовать его вместе с IAnimal.Это имеет смысл, когда вы думаете, что отношения по направлениям IMammal ведут себя как .

В вашем конкретном случае с приведенными примерами вариант 2 кажется правильным,

0 голосов
/ 13 ноября 2018

Вы можете создать общий интерфейс, который реализуют как IMammal, так и IReptile. Но на практике мы реже пишем код, который обрабатывает все эти вложенные типы. Это также может нарисовать вас в углу. Что-то потребуется общий метод, используемый млекопитающими и рептилиями, но он не будет совместим с каким-либо интерфейсом более низкого уровня.

Вместо этого попробуйте создать интерфейсы, такие как IMoveBehavior, IEatBehavior, IReproduceBehavior и поместить различные варианты поведения в их собственные классы.

Таким образом, если вам нужна конкретная реализация IMoveBehavior, вы можете использовать ее на любом типе животных, даже если он не имеет ничего общего с другими животными, которые используют это поведение.

Вы все еще можете использовать наследование. Возможно, вы «сочиняете» лягушку из разных форм поведения, и теперь вам нужны разные типы лягушек. У них может быть так много общего, что наследование имеет смысл. Но лучше начать с композиции, а затем посмотреть, появляется ли шаблон, в котором наследование приносит нам пользу. Если мы начнем с наследования, это может сбить нас с толку.

0 голосов
/ 13 ноября 2018

В основном вы говорите о Разделение интерфейса и, таким образом, вместо того, чтобы поместить в один интерфейс, вы можете определить отдельный интерфейс, который только IMammal и IReptil будут реализовывать или наследовать.

В качестве альтернативы вы также можете throw NotImplementedException() для других типов, которые не относятся к поведению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...