1

このブログ投稿に従って、直面していた問題を解決する方法を見つけました。

私の問題は、彼のように、サブクラスで継承およびアクセスする必要があるプロパティを持つクラスがあることでした。

@interface A : NSObject
@property (nonatomic, readonly) NSUInteger prop;
@end

@implementation A
    // Don't need to synthesize nowadays
@end

@interface B : A
    // No new properties
@end

@implementation B

- (void)establishValueForProp
{
    _prop = 1; // PROBLEM !!!
}

@end

解決策はこれでした:

@interface A : NSObject {
    @protected
    NSUInteger _prop;
}
@property (nonatomic, readonly) NSUInteger prop;
@end

私が疑問に思っているのは、プロパティを保護されていると宣言する別の方法があるかどうかということです?

4

2 に答える 2

3

私が通常これを行う方法は、「ClassName_ForSubclasses.h」などと呼ばれる 2 番目のヘッダーを作成することです。そのヘッダー ファイル内に、サブクラスが呼び出してオーバーライドできるようにするプロパティとメソッドを含むクラス拡張を追加します。次に、サブクラスはそのヘッダーをインポートできますが、クラスの他のユーザーには表示されません。

于 2014-01-24T22:54:15.173 に答える
1

別の一般的な方法は、別の .h ファイル (たとえば、ASubclass.h) を作成し、次のようなものを追加することです。

@interface A (Protected)

@property (nonatomic, readonly) NSUInteger prop;

@end

サブクラスは、この .h をインポートして、このメソッドにアクセスできます。カテゴリはプロパティを追加できないため、このプロパティをAのプライベートinterface(クラス拡張) で再定義する必要があることに注意してください。カテゴリは、このプロパティへのパブリック アクセスを提供します。Apple は、UIGestureRecognizer.h と UIGestureRecognizerSubclass.h (UIGestureRecognizer.h は、サブクラスがオーバーライドするためのより多くのメソッドを公開します) でこの正確なアプローチを採用しています。

保護された (またはプライベートな) メソッドの概念は実際には存在しません。これは、同様の機能をある程度実現するための方法にすぎません。

個人的には、それ以外の場合はパブリック プロパティを公開するクラスの (唯一の) .h ファイルにカテゴリを作成するだけです。このようにして、メインのパブリック インターフェイスから分離されます。とにかくプライベート プロパティにアクセスできるため、このアプローチで十分だと思います。

于 2014-01-24T22:54:38.190 に答える