Подтвердить что ты не робот

Частные классы в Objective C

Мне нужен шаблон для вложенного частного класса в Objective C.

Требования:

  • класс не будет видимым/доступным для других классов.
  • класс может выполнять методы (т.е. не C-структуру)
  • содержащие члены класса видимы/доступны для вложенного класса

Учитывая комментарии, я упрощаю требования:

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

Неужели это невозможно?

4b9b3361

Ответ 1

Objective-C не имеет понятия частных классов или переменных частного экземпляра формальным декларативным способом.

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

И под "это" я имею в виду почти все, что можно объявить; класс, глобальный и т.д.

т.е. если вы вставляете пару @interface/@implementation для класса в файл .m, этот класс фактически является приватным для этого модуля компиляции. Конечно, без пространств имен убедитесь, что класс уникально назван.


Рассмотрим это:

foo.h:

@interface Foo: NSObject
... public interface
@end

Foo.m:

@interface __FooSupportClass: NSObject
... interface here ...
@end

@implementation __FooSupportClass
@end

@interface Foo()
@property(retain) __FooSupportClass *__fooSupport;
@end

@implementation Foo
@synthesize __fooSupport = fooSupport__;
... etc ...
@end

Это дает вам класс поддержки private-by-visibility, доступный только в вашей реализации, с помощью переменной экземпляра и методов setter/getter в вашем классе, которые также не видны вне модуля компиляции.

(Обратите внимание, что Objective-C имеет "переменные экземпляра", а не "переменные-члены". Они похожи, но вам будет лучше использовать словарь языка.)

Ответ 2

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

Правильный Objective-C Помощник "Wannabe" Частные методы?