Частный метод дилеммы Objective-C - PullRequest
10 голосов
/ 06 января 2012

Я знаю, что Objective-C не поддерживает настоящие частные методы. В настоящее время я делаю объявление частных методов, добавляя в файлы классов .m следующее:

@interface MyClass() 

- (void) privateMethodName;

@end


Проблема:

Если я сейчас добавлю подкласс и захочу использовать этот «закрытый» метод, я не смогу! Я получаю ошибку:

Тип получателя 'SubClassName' для сообщения экземпляра не объявляет метод с селектором 'privateMethodName'


Итак, если я не хочу, чтобы не подклассы могли иметь доступ к этому методу, но хочу ли подклассы иметь возможность, что я могу сделать? Каков наилучший / правильный способ достижения моей цели?

Ответы [ 3 ]

16 голосов
/ 06 января 2012

Вы можете отделить «защищенный» интерфейс от общедоступного.В основном заголовке просто объявите открытые методы:

MyMagicThingy.h:

@interface MyMagicThingy: NSObject

- (void) publicMethod;

@end 

Затем добавьте дополнительный заголовок с защищенными методами:

MyMagicThingy+Protected.h

#import "MyMagicThingy.h"

@interface MyMagicThingy (Protected)

- (void) protectedMethods;

@end

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

2 голосов
/ 06 января 2012

То, что вы описываете, на самом деле является защищенным методом. Один из подходов к преодолению этого: Ивари могут быть объявлены @public, @protected или @private. Вы можете объявить защищенный экземпляр помощника, чтобы ограничить доступ к производным экземплярам, ​​который затем вызывает обратно через объект, который его держит.

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

Иногда вам просто нужно документировать «не делайте этого, если вы не подкласс», потому что это не является частью языка. В этом смысле отдельный заголовок, который объявляет категорию защищенных методов, является одним из моих любимых. Он довольно хорошо скрыт от клиентов, но его можно сделать видимым для подклассов путем явного включения - Дирк представил пример этого в то же время, зацените его.

Наконец, если вам удобен ObjC ++, C ++ предлагает этот элемент управления, так что вы можете смешивать режимы и видимость довольно свободно.

0 голосов
/ 06 января 2012

В первую очередь

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

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

Второй

Слово public в вышеприведенном абзаце делает трюк:

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

Одним из таких примеров класса инфраструктуры Apple, который будет UIGestureRecognizer с отдельным заголовком подкласса UIGestureRecognizerSubclass.h.


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

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