Почему Objective-C использует заголовочные файлы вместо однофазных классов, таких как Java?

В основном я работаю на Java и недавно пытаюсь изучить Objective-C для разработки приложений для Mac и iOS. Теперь этот язык сильно отличается от того, к чему я привык, указателей, сообщений и т.д., Но я, кажется, все хорошо понимаю. Это не проблема кодирования для одного слова, но я лучше буду хорошо знаком с тем, с чем имею дело, а не просто знаю, что "это должно быть именно так, потому что это так".

Почему языку Objective-C нужны файлы заголовков? Какова их фактическая цель - быть отдельно от файла .m? Почему функции должны быть объявлены в заголовке, а не только реализованы? Это просто одна из тех вещей, которые просто не вымерли из старого языка, или есть реальное преимущество, а не однофазные классы Java?

Ответы

Ответ 1

В основном файлы .h существуют из-за совместимости с кодом C - все коды C также действительны Objective-C. Компилятор C работает по одному файлу за раз; каждый файл компилируется и анализируется независимо. Компилятор C "должен" видеть объявление определенного символа перед его первым использованием. Итак, если вы используете класс A в B.m, в какой-то момент компилятор должен был увидеть объявление A; чтобы избежать таких действий, как #include "A.m", соглашение состоит в разделении объявлений в файлах заголовков и реализации в файлах .c,.m,.cpp...

Другие языки, такие как Java, будут автоматически сканировать файлы в том же каталоге B.java при компиляции, чтобы найти объявление других классов; Компиляторы C немного "старше", и вам нужно # включить все необходимые заголовки.

Короче: главным образом исторические причины.

Ответ 2

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

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

Новые скомпилированные языки (такие как Java, С#) не используют forward декларации; идентификаторы автоматически распознаются из источника файлы и читать напрямую из динамических символов библиотеки. Это означает файлы заголовков не нужны.

Ответ 3

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