簡単に言えば、サブクラスに対してのみ公開されるプライベート メソッドをクラスに含める方法が必要ですが、Objective-C でこれを行うのは困難 (おそらく不可能) です。
私がこれまでにやったこと:
// 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];
}
この方法ではオブジェクト指向が壊れることはありません (プライベート メソッドを呼び出してコンパイラの警告を無視したり、.h しか知られていないためプライベート メソッド名を推測したりする場合と比較して)、使用可能な保護されたメソッドにはプロトコルが必要であり、これが公開されると、インターフェイスと静的ライブラリのみをクライアントに提供する大きなプロジェクトでは、クライアントは実際にプライベートメソッドを知り、警告に関係なくそれらを呼び出そうとすることができます. 最大の問題は、サブクラスの外部からのものです。ユーザーは、このメソッドを呼び出してprotectedInstance
. 誰でもアドバイスできますか?
ありがとう