Objective-Cの「多重継承」



Multiple Inheritancein Objective C



転載アドレス:http://blog.csdn.net/yiyaaixuexi/article/details/8970734




単一継承では不十分で、問題領域をモデル化することが難しい場合、通常、多重継承を直接考えます。多重継承は、アプリケーションをより直接的にモデル化できる、複数の直接基本クラスからクラスを派生させる機能です。ただし、Objective-Cは多重継承をサポートしていません。メッセージメカニズム名のルックアップはコンパイル時ではなく実行時に行われるため、複数の基本クラスによって引き起こされるあいまいさの問題を解決することは困難です。しかし実際には、Objective-Cは多重継承をサポートする必要はありません。間接的に多重継承を実現するための次の方法を見つけることができます。

  • メッセージ転送
  • デリゲートとプロトコル
  • カテゴリー



個人的には、カテゴリはObjective-Cデザインの真髄の1つであり、Objective-Cが大好きな最大の理由だと思います。
カテゴリは強力なものです。インスタンスだけでなくクラスにもメソッドを追加できます。同意せず、私に思い出させたい人はたくさんいるはずです。カテゴリの制限の1つは、クラスに新しいインスタンス変数を追加できないことです。裏書は本当に台無しです、私に例を挙げて聞いて、ゆっくり話してください。

別の教師クラスは次のとおりです。

[cpp] プレーンビュー コピー
  1. @interface Teacher:NSObject
  2. {{
  3. NSUInteger age
  4. }
  5. @終わり


年齢だけでは先生の説明を満足させることはできません。教師の職業を保存するために職業インスタンスを追加したいと思います。直感的なアイデアは、Teacherをサブクラス化することです。実際、カテゴリを使用することもできます。ランタイムプログラミングの知識を理解し、objc_setAssociatedObjectとobjc_getAssociatedObjectに注意を払う必要があります。

[cpp] プレーンビュー コピー
  1. //
  2. // Teacher + Professional.m
  3. //
  4. #import'Teacher + Professional.h '
  5. #インポート
  6. const char* ProfessionalType ='NSString *'
  7. @implementation Teacher(職業)
  8. -(ボイド)setProf:(NSString *)prof
  9. {{
  10. objc_setAssociatedObject(self、ProfessionType、prof、OBJC_ASSOCIATION_RETAIN_NONATOMIC)
  11. }
  12. -(NSString *)教授
  13. {{
  14. NSString * pro = objc_getAssociatedObject(self、ProfessionType)
  15. 戻るために
  16. }
  17. @終わり


これで、setProf:およびprofを介して教師の職業価値にアクセスできます。