Почему переменные экземпляра Objective C объявлены в интерфейсе? - PullRequest
4 голосов
/ 15 июня 2010

Я только вхожу в Objective-C (Java - мой основной язык OO).

Определение переменных экземпляра объекта в интерфейсе вместо класса кажется странным. Я привык к тому, что интерфейс является общедоступным определением API, в котором нет ничего, кроме сигнатур методов (не считая здесь констант).

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

Разве это преимущество дизайна каким-то образом? Боль в тыловой проблеме, с которой вам просто приходится сталкиваться в Objective-C? Не проблема, просто другая? Есть ли какие-либо сведения о том, почему это так?

Или вы можете поместить состояние объекта в класс, и я просто еще не затронул эту часть в своей книге?

Ответы [ 2 ]

12 голосов
/ 15 июня 2010

UPDATE

Ответ ниже был написан до того, как была реализована языковая функция объявления переменных экземпляра в реализации. Предпосылка вопроса теперь больше не действительна. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * @interface, если вы не хотите быть публичным.


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

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

Немного тяжело дважды записывать все сигнатуры методов, но вы к этому привыкли.

* С 64-битной средой выполнения вам больше не нужно объявлять ivars для синтезированных методов доступа в @interface, но, поскольку все методы общедоступны, это по-прежнему означает раскрытие внутреннего состояния для внешнего мира, хотя и облегчает хрупкий базовый класс проблема.

7 голосов
/ 15 июня 2010

В интерфейсе Objective C вообще не ссылается на экземпляр

Брэд Кокс, который разработал Objective C, решил, что эквивалент объявлений и определений C должен быть явным, поэтому у каждого класса есть раздел @interface, сообщающий, чтоэто выглядит внешне, и @implementation говорит о том, как это реализовано.

Java появилась позже и изменила объектную модель, так что есть только одно определение объекта, которое объединяет @interface и @implementation вместе.Компилятор (и самоанализ во время выполнения) фактически создает интерфейс из кода.

Эквивалентом интерфейса в Java является протокол в Objective C.

Вы просто привыкли к нему.

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