2

私の Objective-C アプリケーションにはNSObject、モデルを構成するサブクラスの階層があります。これらのオブジェクト自体には機能がありません。つまり、プロパティのみがあり、その唯一の目的はデータを保持することです。さらに、この階層 (ツリー) のインスタンスを管理する単一のコントローラーがあります。

そのコントローラのみがツリーに変更を加えることができます (たとえば、ツリー内のオブジェクトのプロパティ)。プログラムの他の部分には、(全体の) ツリーへの読み取り専用アクセスが必要です。

この種のアクセス管理を実現する最も簡単な方法は何ですか?

4

1 に答える 1

3

これは、フレンド クラスの典型的なケースです。ObjC にはフレンド クラスの言語サポートがありませんが、作成は難しくありません。

まず、モデルへのパブリック インターフェイスで properties を宣言する必要がありますreadonly。その部分は明らかなはずです。

次に、モデルの内部で、クラス拡張で必要に応じてプロパティを読み書きできるようにします。(これは、ObjC に慣れていれば明らかなはずです。明らかでない場合は、回答を更新します。)

さて、残りの話です。「Friend」カテゴリ (または「Writer」または「Protected」など、意味のある名前) を作成します。

@interface ModelObject (Friend)
- (void)setSomeProperty:(id)someProperty;
@end

これは、このカテゴリをインポートした人に、setSomeProperty:存在することを知らせるだけです。これで、コントロールはこのファイル ( ) をインポートし、ModelObject+Friend.hプロパティを設定できるようになります。他の全員がインポートModelObject.hし、プロパティは読み取り専用に見えます。

これは、もちろんプロパティだけでなく、アクセスする必要があるものすべてに対して機能します。私はよく、不変クラスを作成してから、「フレンドのみ」のinitWithX:andY:andZ:メソッドを作成します。

于 2012-09-27T14:47:27.960 に答える