C# многоуровневое наследование или дублированная реализация интерфейсов? - PullRequest
0 голосов
/ 06 августа 2020

Похоже, что технически ограничений на количество многоуровневых наследований нет. Пример: класс D наследует класс C, который наследует класс B, наследующий класс A. Однако их имена начинают усложняться по мере того, как вы продолжаете наследовать.

Мне кажется, что на самом деле, имея базовый класс и используя Интерфейсы были бы лучшим подходом.

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

В моем сценарии у меня есть следующее:

  • Базовый класс: Animal
  • Интерфейсы: RankeableByLevel (это имеет дополнительные свойства, которые позволяют ранжировать животных), FilterableByExpertise (это имеет дополнительные свойства, позволяющие фильтровать животных).

Есть 10-15 Animal подклассов , и около 7-8, которые можно было бы ранжировать и / или фильтровать. Я не хочу реализовывать интерфейсы в каждом из 7-8 классов (на мой взгляд, слишком много "дублирования").

Один из вариантов - создать базовый класс с именем AnimalRankeableByLevel, а другой AnimalRankeableByLevelAndFilterableByExpertise особенно этот последний кажется слишком длинным, чтобы быть правильным!

С интерфейсами мне пришлось бы слишком много «дублировать» реализацию. При наследовании слишком большого количества классов это выглядело бы неправильно (слишком длинное имя, слишком много наследований).

Каково было бы решение этой проблемы?

Спасибо!

1 Ответ

0 голосов
/ 08 августа 2020

Предпочитайте композицию наследованию. Реализация интерфейса в 7-8 классах сама по себе не проблема. class и делегируйте реализации интерфейса этому классу.

Пример:

public class SomeAnimal : IRankable
{
  private IRankingCalculator calculator = new RankingCalculator();

  public int Rank => calculator.GetRank();

  //...
}

public interface IRankable
{
   public int Rank {get;}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...