2

簡単に言えば、サブクラスに対してのみ公開されるプライベート メソッドをクラスに含める方法が必要ですが、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. 誰でもアドバイスできますか?

ありがとう

4

2 に答える 2

1

このシナリオを処理する標準的な方法は、内部メソッドを のように別のヘッダーに含めることMySuperClass_Internal.hです。クラス拡張を使用します: @interface MySuperClass (Internal). MySuperClass_Internal.h/usr/local/include またはフレームワークにインストールしないでください。また、ライブラリをクライアントに配信している場合でもインストールしないでください。

于 2013-03-19T01:37:57.103 に答える
1

これを確認してください: Objective-C の保護されたメソッド

簡単に言えば、Objective-C でメソッドが呼び出されないようにする方法はありません。最終的に、クライアントは引き続きperformSelector任意のオブジェクトを呼び出すことができるからです。

于 2013-03-19T01:38:03.887 に答える