Spec-Zone .ru
спецификации, руководства, описания, API
|
Есть много ситуаций в разработке программного обеспечения, когда для несоизмеримых групп программистов важно согласиться на "контракт", который обстоятельно объясняет, как их программное обеспечение взаимодействует. Каждая группа должна быть в состоянии записать их код без любого знания того, как код другой группы пишется. Вообще говоря, интерфейсы являются такими контрактами.
Например, вообразите футуристическое общество, куда управляемые компьютером автоматизированные автомобили транспортируют пассажиров по городским улицам без человеческого оператора. Автомобильные производители пишут программное обеспечение (Java, конечно), который управляет автомобилем — остановка, запустите, ускорьтесь, поверните налево и т.д. Другая промышленная группа, электронные инструментальные производители руководства, делает компьютерные системы, которые получают GPS (Система глобального позиционирования) данные позиции и беспроводная передача условий трафика и используют ту информацию, чтобы управлять автомобилем.
Автоматические производители должны опубликовать интерфейс промышленного стандарта, который обстоятельно объясняет подробно, что методы могут быть вызваны, чтобы заставить автомобиль переместить (любой автомобиль от любого производителя). Производители руководства могут тогда записать программное обеспечение, которое вызывает методы, описанные в интерфейсе, чтобы управлять автомобилем. Никакая промышленная группа не должна знать, как программное обеспечение другой группы реализуется. Фактически, каждая группа считает свое программное обеспечение очень собственным и резервирует право изменить его в любое время, пока оно продолжает придерживаться опубликованного интерфейса.
В языке программирования Java интерфейс является ссылочным типом, подобным class, который может содержать только константы, сигнатуры методов, и вложенные типы. Нет никаких тел метода. Интерфейсы нельзя инстанцировать — они могут только быть реализованы классами или расширены другими интерфейсами. Расширение обсуждается позже в этом уроке.
Определение интерфейса подобно созданию нового class:
public interface OperateCar { // constant declarations, if any // method signatures // An enum with values RIGHT, LEFT int turn(Direction direction, double radius, double startSpeed, double endSpeed); int changeLanes(Direction direction, double startSpeed, double endSpeed); int signalTurn(Direction direction, boolean signalOn); int getRadarFront(double distanceToCar, double speedOfCar); int getRadarRear(double distanceToCar, double speedOfCar); ...... // more method signatures }
Отметьте, что сигнатуры методов не имеют никаких фигурных скобок и завершаются с точкой с запятой.
Чтобы использовать интерфейс, Вы пишете class, который реализует интерфейс. Когда instantiable class реализует интерфейс, он обеспечивает тело метода для каждого из методов, объявленных в интерфейсе. Например,
public class OperateBMW760i implements OperateCar { // the OperateCar method signatures, with implementation -- // for example: int signalTurn(Direction direction, boolean signalOn) { // code to turn BMW's LEFT turn indicator lights on // code to turn BMW's LEFT turn indicator lights off // code to turn BMW's RIGHT turn indicator lights on // code to turn BMW's RIGHT turn indicator lights off } // other members, as needed -- for example, helper classes not // visible to clients of the interface }
В автоматизированном автомобильном примере выше, это - автомобильные производители, которые реализуют интерфейс. Реализация шевроле будет существенно отличаться от той из Тойоты, конечно, но оба производителя будут придерживаться того же самого интерфейса. Производители руководства, которые являются клиентами интерфейса, будут системы сборки, которые используют данные GPS на расположении автомобиля, цифровых картах города, и данных трафика, чтобы управлять автомобилем. Таким образом, системы наведения вызовут методы интерфейса: повернитесь, перестройтесь на другую полосу, тормозите, ускорьтесь и т.д.
Автоматизированный автомобильный пример показывает интерфейс, используемый в качестве Прикладного программного интерфейса промышленного стандарта (API). API также распространены в коммерческих программных продуктах. Как правило, компания продает пакет программного обеспечения, который содержит сложные методы, которые другая компания хочет использовать в ее собственном программном продукте. Примером был бы пакет методов цифровой обработки изображений, которые продаются компаниям, делающим программы графики конечного пользователя. Компания обработки изображений пишет свои классы, чтобы реализовать интерфейс, который она обнародовала ее клиентам. Графическая компания тогда вызывает методы обработки изображений, используя подписи и типы возврата, определенные в интерфейсе. В то время как API компании обработки изображений обнародован (его клиентам), его реализация API сохраняется как близко защищенный секрет — фактически, это может пересмотреть реализацию позднее, пока это продолжает реализовывать исходный интерфейс, на который положились его клиенты.
У интерфейсов есть другая очень важная роль в языке программирования Java. Интерфейсы не являются частью иерархии class, хотя они работают в комбинации с классами. Язык программирования Java не разрешает множественное наследование (наследование обсуждается позже в этом уроке), но интерфейсы обеспечивают альтернативу.
В Java class может наследоваться только от одного class, но это может реализовать больше чем один интерфейс. Поэтому, у объектов могут быть многократные типы: тип их собственного class и типы всех интерфейсов, которые они реализуют. Это означает, что, если переменная, как объявляют, является типом интерфейса, его значение может сослаться на любой объект, который инстанцируют от любого class, который реализует интерфейс. Это обсуждается позже в этом уроке в разделе, названном "Используя Интерфейс как Тип."