Обоснование определения специальных методов в Objective-C - PullRequest
3 голосов
/ 17 августа 2011

Я начал программировать на C ++. Из-за этого меня рано научили, что для каждого определения должна быть декларация. Для функций-членов это требование.

Теперь, когда я начал изучать Objective-C, я был несколько «шокирован», когда обнаружил, что вам не нужно их объединять. Очевидно, что если вы не определите метод, он не будет вызван. Если вы не объявляете метод, а определяете его, он будет вызван.

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

Я нашел пару ответов здесь: Цель c: отношение метода .h и .m . К сожалению, они не очень убедительны.

1 Ответ

4 голосов
/ 18 августа 2011

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

Что касается другой стороны, имея методы, реализованные, но не объявленные, то нет определенного способа определить приватные методы в Objective-C, и время от времени вы хотите определять методы, которые известны только вашим собственные занятия и не для всех остальных. Таким образом, вы не объявляете метод в своем файле .h , но, тем не менее, реализуете его в своем файле .m .

Компилятор обычно будет жаловаться, что вы используете неопределенный метод, но вы можете либо проигнорировать это, либо объявить эти закрытые методы в вашем файле .m как особую категорию, это будет выглядеть так:

@interface YourClass (PrivateMethods)
  - (void) somePrivateMethod;
@end


@implementation YourClass 
  - (void) somePrivateMethod { NSLog(@"Something!"); }
@end

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

...