3

私は (UML からの) コード生成の大ファンであり、Java の世界から来たので、Objective-C で自動化された双方向の関連付け管理をどのように実装するのだろうかと考えています。

アソシエーション パートナー <-> アドレスをイメージします。1 対多で、両端からナビゲートできます。私が達成したいのは、アドレスをパートナーに追加すると、そのアドレスオブジェクトはそのパートナーについて自動的に認識できるようになることです。

したがって、実装パターンは、パートナー側に NSMutableArray* を、アドレス側にパートナー* を配置することになります。setPartner:(Partner*)aPartner は、アドレスを管理するパートナーの NSMutableArray にアドレス (self) を自動的に挿入できるため、Address 側のプロパティは簡単に実装できます。ただし、もう一方の実装はそれほど簡単ではありません。Objective-C での to-many 参照の標準実装パターンは、@property の get メソッドを介して取得できる NSMutableArray のようです。この NSMutableArray を所有するオブジェクトは、Address オブジェクトを配列に挿入できますが、もちろん反対側は更新されません。

この種の関連付け管理には、たとえば addTo...() および removeFrom...() メソッドを介した他のパターンがあることを私は知っています。しかし、これが Cocoa プログラミングの他の原則に適合するかどうか、または Cocoa を効率的に使用することを妨げるかどうかはまだわかりません。ここでInterface Builderについて考えています。あまり経験はありませんが、ArrayController と呼ばれるものを見たことがあります。これは非常に便利ですが、NSMutableArray タイプのプロパティが動作することを期待しているようです。そして、この男が配列にオブジェクトを挿入した場合、私はそれをインターセプトして反対側の調整を行う必要があります。

Java プログラマーとして、私は NSMutableArray をサブクラス化し、そのメソッドのいくつかをオーバーライドして、反対側を操作する傾向があります。これはまったく可能でしょうか?カテゴリについて読みましたが、これまでのところ、この方法でクラスにメソッドを追加することしかできず、メソッドをオーバーライドしたり、その構造に追加したりできないことを理解しています。それとも、メソッド転送にする必要がありますか? 私は今混乱しています。あなたが私を正しい考え方に向けることができれば、それはとても素晴らしいことです. どうもありがとう!

4

1 に答える 1

9

ココアへようこそ。組み込みコレクションをサブクラス化しないでください。あなたは狂ってしまいます。

はっきりさせておきます。Cocoa には、「クラス クラスタ」と呼ばれるものがあります。クラスターは、すべて共通のパブリック スーパークラスを持つプライベート クラスの階層です。この場合、NSArrayはパブリック スーパークラスであり、実際の配列実装であるプライベート サブクラスがあります。これは、サブクラス化するときに、どのクラス (または複数のクラス) をサブクラス化する必要があるかわからないため、非常に難しい課題です。

NSObject一般的な回避策は、を「ラップ」する新しいサブクラスを作成することですNSArray(つまり、インスタンス変数 ["フィールド"] として配列を持ちます)。その後、カスタム ラッパーでメソッドを呼び出します。必要なカスタム ロジック。

あなたの質問への回答として、1 対 1、1 対多、または多対多の関係を自動的に維持する必要があるこの種のセットアップがある場合、使用に勝るものはないことがわかりました。コアデータ。CoreData は、多かれ少なかれオブジェクト ストアに似た組み込みフレームワークです。それが行う真に素晴らしいことの 1 つは、あなたが探している関係の整合性を処理することです。

于 2010-07-06T22:24:03.290 に答える