Является ли программирование на интерфейсах в Java такой же концепцией, как использование заголовочных файлов в C / C ++? - PullRequest
13 голосов
/ 18 февраля 2011

Ява-код, над которым я сейчас работаю, часто имеет структуру типа

file Controller.java:

interface Controller {...}

file ControllerImpl.java:

class ControllerImpl implements Controller {...}

Но для каждого интерфейса есть только одна реализация. Разве это не то же самое, что использование заголовочных файлов в C / C ++, где у меня есть код, разбитый на файлы типа

Controller.hpp
Controller.cpp

Из того, что я знаю, файлы заголовков в C / C ++ были введены, чтобы помочь компилятору, который больше не нужен в Java. Кроме того, заголовочные файлы должны помочь с удобочитаемостью кода, но с современной IDE со свертыванием и контурным представлением это также больше не является необходимостью.

Так почему же люди снова вводят заголовочные файлы в Java через черный ход, программируя на интерфейсах?

Ответы [ 7 ]

8 голосов
/ 18 февраля 2011

Нет. В C ++ файлы (заголовки) не совпадают с классами.

Программирование с использованием интерфейсов, как в Java, может быть выполнено и на C ++, путем программирования с использованием абстрактных базовых классов .

Однако термин «интерфейс» в Java довольно ограничен. По сути, любое объявление функции является интерфейсом:

void call_me(int times); 

Как и, конечно, классы и другие виды.

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

5 голосов
/ 18 февраля 2011

Интерфейсы не связаны с желанием сохранить заголовочные файлы.

Интерфейсы, наиболее близкие Java к поддержке http://en.wikipedia.org/wiki/Design_by_contract

3 голосов
/ 18 февраля 2011

интерфейсы больше похожи на абстрактные базовые классы в c ++.

причина, по которой они часто используются в Java, заключается в том, что множественное наследование не существует в Java (оба были проектными решениями). C ++ поддерживает множественное наследование, поэтому ... он может решить эту проблему (и через несколько других).

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

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

2 голосов
/ 18 февраля 2011

В Java интерфейс определяет контракт , тогда как класс обеспечивает реализацию контракта.

Большинство контрактов имеют только одну значимую или релевантную реализацию;некоторые даже предполагают конкретную реализацию и не допускают никакой другой.Эти контракты и их реализации определяются вместе в классах без каких-либо интерфейсов.Пример: java.lang.String.

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

На уровне файлов и интерфейс, и класс являются единицами компиляции и заслуживают своего собственного файла.

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

1 голос
/ 18 февраля 2011

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

Правильный дизайн программы на C ++:

  • Поместите одно объявление класса и одно только в h-файле.
  • Дайте указанному h-файлу то же имя, что и объявлен класс.
  • Поместите определение класса в cpp-файл с тем же именем, что и ч-файл.

Правильный дизайн Java-программы:

  • То же, что и для C ++, но также помещает интерфейсы в свои собственные файлы.

Правильный дизайн C:

  • В h-файле объявлять функции, принадлежащие определенному «модулю кода».
  • Поместить определения функций в c-файл с тем же именем, что и h-файл.
  • Все переменные, которые вы объявили бы как закрытые / защищенные, если бы писали на C ++ / Java, должны быть либо по-настоящему приватными через концепцию «непрозрачных типов / указателей», либо помещаться в область видимости файла и объявляться как статические, чтобы их можно было использовать совместно между функциями внутри «модуля кода» (хотя это делает код не реентерабельным).

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

1 голос
/ 18 февраля 2011

Заголовочные файлы в C / C ++ не имеют никакого отношения к классам или интерфейсам вообще.

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

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

Заголовочный файл в C ++ может содержать классы, определения функций, макросы, перечисления и многое другое, но концептуально очень отличается от классов или интерфейсов.

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

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

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

0 голосов
/ 18 февраля 2011

Нет, программирование на основе интерфейсов не имеет ничего общего с тем, используете ли вы заголовочные файлы.

Явное определение интерфейса позволит независимо развивать программу с обеих сторон.«Интерфейс» тела кода обозначает контракт, которому он подчиняется.

Языки программирования никогда не полностью поддерживают определения интерфейса, они просто имеют некоторый синтаксический сахар для обработки аспекта правильности типа.С одной стороны, аспекты производительности в большинстве случаев неопределенны, как и правила сложности и т. Д. (Стандарт C ++ определяет некоторые требования к сложности для контейнеров и алгоритмов).

Эта ограниченная поддержка оставила Java с ключевым словомinterface: поскольку объектная ориентация связана с группированием функциональности по классам, имело смысл соединить концепцию «интерфейса» с чем-то, что группирует определения функций-членов.Несколько классов могут реализовать данный интерфейс, и класс может также реализовать много интерфейсов.

В C ++ они даже не удосужились явно добавить «интерфейс» в язык.То, что ближе всего подходит к «интерфейсу классов» Java, - это чистый абстрагирующий класс: класс, имеющий только чисто виртуальные функции-члены.Поскольку C ++ поддерживает множественное наследование, классы могут реализовывать несколько таких «интерфейсов».

Когда дело доходит до разделения вашего кода на заголовки и исходные файлы, это совершенно не имеет отношения к концепции интерфейса.Но на самом деле: в C ++ «вызывающий контракт» в основном указывается в заголовочном файле.И действительно, это сокращает время компиляции (меньше операций ввода-вывода).Но это технический аспект компилятора.

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