2013-03-19 2 views
2

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

То, что я сделал до сих пор:

// MyClass.h 

@protocol MyClassProtectedMethodsProtocol 
- (void)__protectedMethod; 
@end 

@interface MyClass : NSObject 
- (void)publicMethod; 
- (id<MyClassProtectedMethodsProtocol>)protectedInstanceForSubclass:(id)subclass; 
@end 

Тогда:

// MyClass.m 
#import "MyClass.h" 

@interface MyClass() <MyClassProtectedMethodsProtocol> 
@end 

@implementation MyClass 

- (void)publicMethod 
{ 
    // something 
} 

- (id<MyClassProtectedMethodsProtocol>)protectedInstanceForSubclass:(id)subclass 
{ 
    if ([subclass isKindOf:MyClass.class] && ![NSStringFromClass(subclass.class) isEqualToString:NSStringFromClass(MyClass.class)]) 
    { 
     // the subclass instance is a kind of MyClass 
     // but it has different class name, thus we know it is a subclass of MyClass 
     return self; 
    } 
    return nil; 
} 

- (void)__protectedMethod 
    // something protected 
{ 
} 

@end 

Тогда подкласс MyClass может просто:

id<MyClassProtectedMethodsProtocol> protectedMethodInstance = [self protectedMethodForSubclass:self]; 
if (protectedMethodInstance != nil) 
{ 
    [protectedMethodInstance protectedMethod]; 
} 

Таким образом, не ломается OO (по сравнению с вызов частного метода и игнорирование предупреждения компилятора или даже угадывание имени частного метода как только .h известен), но для доступных защищенных методов необходим протокол, и как только это будет показано, в большом проекте, который мы передаем только интерфейсу и статической библиотеке клиенту, клиент может фактически знать частные методы и попытаться вызвать их независимо предупреждения. И самая большая проблема - из-за пределов подкласса, пользователь может также вызвать этот метод, чтобы получить protectedInstance. Может кто-нибудь советовать?

Благодаря

+0

Отдельный заголовок является каноническим способом для этого - посмотрите, например, на UIGestureRecognizer. –

ответ

1

Стандартный способ обработки этой ситуации должен включать внутренние методы в отдельном заголовке, как MySuperClass_Internal.h. Используйте расширение класса: @interface MySuperClass (Internal). Не устанавливайте MySuperClass_Internal.h в/usr/local/include или в рамках, или же вы доставляете библиотеку своим клиентам.

1

Проверьте это: Protected methods in Objective-C

Проще говоря, нет никакого способа, чтобы предотвратить метод от призыва в Objective-C, так как в конечном счете, клиент может до сих пор называют performSelector на любом объекте.

+3

Вместо размещения ссылки на дубликат, вы должны проголосовать, чтобы закрыть вопрос как дубликат. – rmaddy

+0

@rmaddy Я действительно не рассматривал это как дубликат, так как ОП пытался использовать определенный подход, на который он хотел комментировать. Но я вижу вашу точку зрения. – Cezar

Смежные вопросы