Наследование интерфейса VS-класс, реализующий два интерфейса - PullRequest
0 голосов
/ 14 марта 2019

Допустим, у нас есть два интерфейса:

interface Ilayer1 : Ilayer2
{
  string testMethod1();
}


interface Ilayer2
{
   string testMethod2();
}

class A: Ilayer1
{
   ...//implement all methods of Ilayer 1 and Ilayer2
}

Итак, мои вопросы:

  1. Какова цель наследования интерфейса? Поскольку они могут иметь различные сигнатуры методов для реализации, так что же получает Ilayer1, наследуя от Ilayer2?
  2. Мы можем просто удалить отношения наследования между Ilayer1 и Ilayer2 и просто позволить классу A реализовать оба интерфейса как class A: Ilayer1, Ilayer2

Ответы [ 3 ]

2 голосов
/ 14 марта 2019

Это та же семантика, что и наследование между классами.
В мире ООП, производный тип Наследует базовый тип, когда это более конкретная версия базового типа - независимо от того, является ли этот тип интерфейсом или классом, принцип остается неизменным.

Вот пример из .Net Framework: Интерфейс IList наследует интерфейс ICollection , который наследует интерфейс IEnumerable .

Интерфейс IEnumerable предоставляет метод GetEnumerator(), необходимый для перечисления с использованием цикла foreach.

ICollection Добавляет новые возможности: свойство Count и метод CopyTo.

IList добавляет еще больше возможностей - индексатор, Add и Remove методы и т. Д.

Таким образом, IList является более конкретным типом ICollection, который является более конкретным типом IEnumerable.

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

Еще одним преимуществом этого является тот факт, что вы можете объявлять методы расширения в интерфейсе и использовать его в любом классе, который реализует этот интерфейс, прямо или косвенно, путем реализации интерфейса, который его наследует - как в классах.

Что касается вопроса, почему бы не удалить наследование и не реализовать отдельно два интерфейса - это имело бы смысл, если бы интерфейсы не были связаны - как, например, в классе Control (в System .Windows.Forms) - Он реализует множество интерфейсов, таких как IDropTarget и IComponent, которые не связаны.

1 голос
/ 14 марта 2019

Один пример из реальной жизни:

interface IShape 
{
    double X { get; }
    double Y { get; }
}

interface IAreaShape : IShape
{
    double GetArea();
}

interface IPerimeterShape : IShape
{
    double GetPerimeter();
}

Теперь предположим, что у вас есть форма Rectangle : IAreaShape, IPerimeterShape, и вы можете рассчитать как ее площадь, так и периметр. Если у вас есть объект типа IAreaShape или IPerimeterShape, он должен быть IShape. Этот ответ на ваш второй вопрос.

Теперь для вашего первого вопроса, просто предположим, для примера, у нас есть Circle, что я могу вычислять только площадь, но не периметр. В этом случае мы просто объявляем это Circle : IAreaShape.

А для управления: List<IShape> shapes может принимать и Круг, и Прямоугольник, и все, что угодно, пока они реализуют IShape (или любой производный тип IShape). Вы можете сделать это, если вам все равно, можно ли рассчитать их площадь или периметр, но вы всегда можете получить их координаты X и Y.

0 голосов
/ 14 марта 2019
  1. Ilayer1 наследует Ilayer2, что означает, что любой, реализующий Ilayer1, должен будет реализовать testMethod1() и testMethod2(). Почему есть?Почему бы и нет?Потому что мы можем?Я думаю, что в больших проектах с большим количеством интерфейсов это может стать довольно утомительным, если вам нужно указать все интерфейсы, которые некоторый класс реализует отдельно (хотя в хорошем S OLID дизайне класс обычно не должен 'в любом случае реализовать несколько интерфейсов).Таким образом, вы можете «группировать» интерфейсы, используя их для реализации других.Вы также можете 'версия' интерфейса , используя наследование интерфейса.
  2. Вы можете.Тебе решать.Хорошо иметь выбор.Используйте наследование или реализуйте интерфейсы отдельно.Вам решать.

Интерфейсы могут наследоваться от других интерфейсов.Класс может включать интерфейс несколько раз через базовые классы, которые он наследует, или через интерфейсы, которые наследуют другие интерфейсы.Однако класс может обеспечить реализацию интерфейса только один раз и только в том случае, если класс объявляет интерфейс как часть определения класса (class ClassName : InterfaceName).Если интерфейс наследуется, потому что вы унаследовали базовый класс, который реализует интерфейс, базовый класс обеспечивает реализацию членов интерфейса.Однако производный класс может переопределять любые элементы виртуального интерфейса вместо использования унаследованной реализации. Источник

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