Проще говоря, мне нужен способ иметь некоторые частные методы в классе, которые отображаются только для его подклассов, и это сложно (возможно, невозможно) сделать это в 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
. Может кто-нибудь советовать?
Благодаря
Отдельный заголовок является каноническим способом для этого - посмотрите, например, на UIGestureRecognizer. –