Зачем нужны ссылки на интерфейсы

231
25 октября 2017, 02:44

Есть программа, в которой я использую ссылки на интерфейсы. Грубо говоря. У меня есть интерфейс IRoom, в которой есть интерфейс ITableList, с методами взаимодействия со столами, в котором есть интерфейс ITable со всеми свойствами стола.

  1. Зачем разработчики сделали так, если можно было использовать объекты в объектах?
  2. Где разработчики реализовали все методы интерфейсов, если я работаю лишь с ссылками на интерфейс? Просто необходимо реализовать подобное приложение и пытаюсь понять, зачем в данном сделали именно так.

Это интерфейс Позиций

Это интерфейс Список позиций взаимодействия с Позициями

Это интерфейс всего, там же и есть взаимодействие со Списком позиций

Это код взаимодействия sec - ISecurity, Positions - IPositionList, GetLast.... - IPosition

Answer 1
  1. Потому что под интерфейсом может скрываться экземпляр любого класса, реализующего этот интерфейс, и при необходимости его можно легко подменить (например в целях тестирования или чтобы изменить поведение). В случае с экземпляром конкретного класса подменить его на экземпляр какого-то другого класса уже нельзя.
  2. Под каждым интерфейсом скрывается какая-то конкретная реализация, в которой и определены необходимые методы. Например:

    interface IFoo 
    {
        IBar Bar { get;set; }
       // прочие свойства и методы
    }
    class Foo : IFoo
    {
        public IBar Bar { get; set; }
    }
    
    var foo = new Foo();
    // здесь мы присваиваем свойству Bar переменную класса Bar, в котором
    // уже определены все методы, указанные в интерфейсе IBar
    foo.Bar = new Bar(); 
    
Answer 2

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

READ ALSO
С# как сложить время, если строковые значения?

С# как сложить время, если строковые значения?

Как сложить время, если строковые значения ?

201
JSON ругается на { }

JSON ругается на { }

Как решить эту проблему?

251
Почти рабочий рейкастинг

Почти рабочий рейкастинг

Здравствуйте! Сейчас пытаюсь написать 3d бродилку, руководствуясь этой статьей

374
Кастомная сортировка

Кастомная сортировка

Привет, Я писал тестовый фильтр который должен возвращать мне данные в ng-repeat

308