1

Objective-Cは多重継承をサポートしていないので、クラス間でコードを共有するための他のメカニズムがありますか?継承のないObjective-Cのクラス間でコードを共有できますか?

私は既存のxmlスキーマの上にCocoaライブラリを作成しています。スキーマ内の多くの要素(たとえば、)は、複数の型で使用されます。私はこれを何とかして集中化したいと考えていたので、@property NSString *nameと関連するコードを追加して、name属性を持つすべての単一クラスのnameプロパティのxmlを生成する必要はありませんでした。複数の継承がサポートされていればそれはかなり簡単ですが、それ以外の方法はわかりません。

私が考えることができる最も良いことは、各オプションプロパティをエンコードするメソッドのスーパーセットを持つ共通のスーパークラスを作成し、各クラスのエンコードメソッドで適切なメソッド(つまりencodeName)を呼び出していることです。それは最善の方法のように見えますか?

+0

私は最初のObjective-Cプロジェクトで同じ手法を使用しました。 – user523234

答えて

1

あなたのプロパティ/機能などで新しいCategoryを作成し、そのカテゴリをNSObjectに追加することをお勧めします。これにより、NSObjectのすべてのサブクラスですべてのプロパティと関数を使用できるようになります。正確には多重継承ではありませんが、大きな柔軟性を提供します。

+0

共有ベースクラスにすべてのメソッドを配置するよりも優れていますか?特に、カテゴリにプロパティを追加できるとは思いませんでした。 – brentopolis

+0

あなたは、あなたの共通の機能のための単なる人工的なスーパークラスではなく、あなたが実際に望むオブジェクトからサブクラス化できるという利点があります。クラスにプロパティを追加する必要がある場合は、拡張子を使用して、KVCの後にgetter/setterを自分で作成します。 – Perception

0

実際には、runtime's Associative Reference関数を使用して、実行時にクラスにデータを追加することができます。これは通常のSDKの作業よりも少し深いですが、かなりうまく動作します。 getterとsetterを持つ完全なプロパティと同じではありませんが、オブジェクトをインスタンスに関連付けます。

0

メソッドが特定のオブジェクトに対してのみ必要な場合は、そのクラスのサブクラスが移動する方法であるか、その特定のクラスのカテゴリを使用する方がよいでしょう。 NSObjectのカテゴリは、キャストするのにかなり広いネットです。

さらに状態を追加する場合は、サブクラス化がおそらく最も安全な方法です。

カテゴリを追加する場合は、競合を避けるために、メソッドにプレフィックスを付けることを確認してください。例えば。 PSMySpecialMethodと対照的にmySpecialMethod

関連する問題