Описание, для чего нужен интерфейс? - PullRequest
3 голосов
/ 16 апреля 2009

Как бы вы описали назначение интерфейса для ученика, который понимает базовый дизайн ООП?

Ответы [ 10 ]

4 голосов
/ 16 апреля 2009

Я предпочитаю термин "контракт" для взаимодействия, он определяет "контракт", который должен соблюдать любой разработчик.

3 голосов
/ 16 апреля 2009

Как n00b, термин "контракт" никогда не имел для меня никакого смысла. Я долго обдумывал это и все еще не мог с этим смириться. Это не помогло мне понять интерфейсы вообще ... ни в коей мере.

Итак, когда я учу других, я вместо этого выражаю их в терминах «характеристик».

Итак, интерфейс описывает характеристики типа. И определенный тип может иметь несколько наборов характеристик. Тем не менее, эти характеристики должны быть конкретно определены (реализованы) разработчиком, когда он решает, что тип должен иметь эти характеристики.

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

Иногда, в зависимости от аудитории, я также буду использовать вилки и розетки от Lowe's или Home Depot, чтобы привести пример. IE: есть несколько вилок на столе. Все они имеют разные характеристики. Но есть два замечания:

  1. Заглушки не реализованы. У них нет шнуров, подключенных к инкапсулированному источнику питания или «кодовой базе», которая определяет, что будет предоставлять интерфейс при работе.
  2. Я использую только один тип розетки, который подходит только к одной из пробок в образцах. «характеристики» другого не позволят приемнику использовать интерфейс, потому что приемник не «реализует» характеристики интерфейса.

Надеюсь, это поможет.

1 голос
/ 16 апреля 2009

цитата из http://java.sun.com/docs/books/tutorial/java/concepts/interface.html

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

0 голосов
/ 28 августа 2011

Когда класс X наследует от другого класса Y, это имеет два эффекта:

  1. Класс X получает реализации по умолчанию для большей части или всех функциональных возможностей класса Y и, таким образом, должен только определять для себя вещи, которые отличаются от класса Y.
  2. Объект класса X можно использовать практически везде, где можно использовать объект класса Y.

Наследование является очень мощным, но имеет фундаментальное ограничение: каждый класс, кроме Object, должен быть производным точно от одного другого класса. Если наследование было единственным средством, с помощью которого объект одного типа мог бы заменить другой тип, это означало бы, что единственный способ, которым один тип мог бы заменить два или более супертипов, был бы, если бы один из этих супертипов сам мог бы заменить другой. , К сожалению, есть много ситуаций, в которых отношения типов не образуют хорошую иерархию. Например, в графической программе можно захотеть иметь возможность рассматривать как FilledRectangle, так и FilledEllipse как заменяемые для FilledShape, и рассматривать как FilledEllipse и OutlineEllipse как заменяемые для EllipseShape, но для этого требуется, чтобы FilledEllipse заменял оба FilledShape и EllipseShape, хотя ни один из них не может заменить другой.

Интерфейсы обходят это ограничение, предоставляя средство, с помощью которого тип может объявить себя заменяемым для многих других типов (интерфейсов) без необходимости наследования от них. Например, в приведенном выше графическом примере может быть интерфейс IFilledShape с такими элементами, как FillColor, и интерфейс IEllipseShape с такими элементами, как SetCenter, GetMajorAxis и т. Д. Если подпрограмма ожидает параметр типа IFilledShape, можно передать в FilledRectangle, FilledEllipse, FilledTriangle или любой другой тип, который реализует IFilledShape. Тот факт, что FilledEllipse реализует IFilledShape, не мешает ему также реализовывать IEllipseShape или IDrawableShape или любой другой интерфейс.

0 голосов
/ 16 апреля 2009

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

У меня нет большого опыта работы с ООП, но я изложил свои мысли ниже. Я уверен, что другие более опытные программисты ООП могут добавить к этому больше (или исправить меня, если я допустил ошибку).

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

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

Чтобы взять пример из Программирование на C # 4-м издании автомобиль - это транспортное средство, а дом - это здание, однако оба класса могут реализовать возможность CanBeBoughtWithABigLoan.

0 голосов
/ 16 апреля 2009

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

Addit: Есть несколько очень простых, но описательных, таких как, IComparable, ISerializable, ...

0 голосов
/ 16 апреля 2009

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

Вот почему для определения интерфейса всегда требуется дополнительный документ (или комментарий), объясняющий, что каждый участник должен «делать».

Например, если интерфейс включает метод Add с двумя целочисленными параметрами и одним целочисленным результатом, необходимо указать, что результат должен быть суммой обоих параметров. (И это тривиальный пример, но недоразумения могут быть очень хлопотными в этот момент).

0 голосов
/ 16 апреля 2009

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

0 голосов
/ 16 апреля 2009

Интерфейс - это то, что обещает сделать разработчик. Это как список функций, которые он поддерживает.

0 голосов
/ 16 апреля 2009

Прежде всего, я бы сказал, что у нас есть команда, и менеджер по программированию расскажет вам о реализации некоторых определенных функций, например, в Java или C #. Они разрабатывают интерфейс и «вы», реализуя тот интерфейс, гарантирующий, что ваш класс имеет те же функциональные возможности. А потом я бы поговорил с ними о преимуществах, которые дает интерфейс

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