Унаследованные методы, которых нет в заголовочном файле суперкласса - PullRequest
0 голосов
/ 01 сентября 2011

Есть ли способ иметь «закрытые» методы в суперклассе (которых нет в его заголовочном файле) и по-прежнему иметь доступ к ним из подклассов?

Ответы [ 2 ]

3 голосов
/ 01 сентября 2011

Вы можете использовать пользовательскую категорию, например:

Stuffy.h

// The "official" header file to be used by almost anyone

@interface Stuffy { 
    int myMember;
}

- (void) somePublicMethod;
@end

Stuffy + Secret.h

// The magic header file, which should only be used by knowledgable people

#import "Stuffy.h"

@interface Stuffy (Secret)
    - (void) _pseudoProtectedMethod;
@end

Stuffy.m

#import "Stuffy+Secret.h"

@implementation Stuffy 

- (void) somePublicMethod {
    // ...
}

@end

@implementation Stuffy (Secret)

- (void) _pseudoProtectedMethod {
    // ...
}

@end

Подклассы Stuffy теперь могут либо импортировать Stuffy.h в свои файлы .m и придерживаться общедоступного API, либо импортировать Stuffy+Secret.h и использовать полузащищенные компоненты.

Обратите внимание, что Objective-C не имеет истинного понятия о protected или private методах.По сути, любой может включить Stuffy+Secret.h и использовать материал, заявленный там.

1 голос
/ 01 сентября 2011

Вы можете «обмануть» несколькими способами.В дополнение к категориям, вы можете просто привести свой указатель Stuffy к FunnyStuff и получить для него целую «черту» 1003 *.(Только не объявляйте статику и не делайте @implementation.) Или, немного чище, приведите к @protocol, который определяет ваши добавленные методы.(И, поскольку вы делаете подкласс, вы можете просто добавить протокол к определению подкласса и избежать любого приведения.)У @implementation есть соответствующее объявление в @interface, и вызовы методов являются полностью динамическими, эффективно включая поиск имени.Единственное, что вам нужно сделать - это заставить компилятор разрешить вызов.(На самом деле, вы можете сделать вызов без объявления вообще, если не возражаете против предупреждения компилятора.)

...