私は現在、すでにスーパークラスを持っているクラスを持っています。別の既存のクラスからメソッドも呼び出したいのですが、スーパークラスとして定義されていません。2番目のスーパークラスを既存の子クラスに割り当てることは可能ですか、それとも不可能ですか。
可能であれば、どうすればいいですか。それが不可能な場合、回避策は何ですか?
私は現在、すでにスーパークラスを持っているクラスを持っています。別の既存のクラスからメソッドも呼び出したいのですが、スーパークラスとして定義されていません。2番目のスーパークラスを既存の子クラスに割り当てることは可能ですか、それとも不可能ですか。
可能であれば、どうすればいいですか。それが不可能な場合、回避策は何ですか?
不可能です。Objective-C は単一継承です。
状況によっては、Compositionがこれを回避するための適切なパターンになる場合があります。クラス Foo があり、Foo のインスタンスにもクラス Bar から動作を継承させたいとします。
Bar のインスタンスを Foo 内のインスタンス変数として保持し、メソッド呼び出しを委任できます。Objective-C は動的に型付けされるため、Foo のインスタンスを Bar のインスタンスとして単純にキャストし、Bar を期待する任意のコードに渡すことができます。Foo が Bar と同じすべてのメソッドに応答する限り、誰もその違いを知りません。
工夫を凝らしたい場合 (または Bar のメソッドが多すぎて、それぞれを書き出したくない場合)、メッセージ転送を使用して、Foo クラスが認識しないメッセージを Bar インスタンスに渡すことができます。のドキュメントforwardInvocation:
を参照して、これがどのように機能するかを確認してください。
Objective C は多重継承をサポートしていませんが、インターフェイスを使用してこの機能を実現できます。