9

クラスAがUIViewControllerのサブクラスである iPhone アプリがあります。

ここに画像の説明を入力

今、私はAを再利用したい新しいアプリを作成していますが、それをBからサブクラス化します。 BはUIViewControllerからサブクラス化するため、これで問題ありません。

ここに画像の説明を入力

しかし今、 GLKViewControllerのサブクラスである別のクラスCがあります。

ここに画像の説明を入力

Bを変更せずに再利用する 3 つ目のアプリを作成しようとすると、問題が発生します。BはUIViewControllerから継承するため、 BGLKViewControllerから継承する必要があることをCに何らかの方法で伝える必要があります。これは多重継承の場合だと思います。

ここに画像の説明を入力

私が読んでいることから、これを処理する最良の方法は、合成を使用することですが、それを自分の状況に最適に適用する方法がわかりません。

代替ソリューションとして、ラッパークラスDを作成するだけでよいことに気付きました。これをアプリごとに変更して、目前のタスクに適したスーパークラスからサブクラス化できます。

ここに画像の説明を入力

ここに画像の説明を入力

しかし、それは一種のハックのようです。これを行うより良い方法はありますか?

4

3 に答える 3

7

ObjectiveCは単一の継承のみをサポートします。この場合、一般的な機能にプロトコルを使用することをお勧めします。ヘルパーオブジェクトを使用して、プロトコルメソッドを実装できます。この場合、オブジェクトが特定のクラスのメンバーであるかどうかではなく、特定のメソッドのセットを実装するかどうかに関心があります。

于 2013-03-15T22:15:39.417 に答える
3

Objective-C でそれを行うことはできません。Java や他のほとんどの最新言語のように、単一の継承です。

構成または委任のパラダイムを使用する

于 2013-03-15T19:23:27.897 に答える
1

カテゴリを使用することで、それをカバーできる可能性があります。それは確かに多重継承と同じではありませんが、時々仕事をします。

カテゴリの例を下書きして、それがあなたの目的を達成するかどうかを見てみましょう.

ヘッダ:UIViewController+MyAwesomeExtension.h

@interface UIViewController (MyAwesomeExtension)
- (void)doSomething;
@end

実装:UIViewController+MyAwesomeExtension.m

@implementation UIViewController (MyAwesomeExtension)
- (void)doSomething
{
    NSLog(@"doing something totally awesome");
}
@end

これで、サブクラスの 1 つから使用できます。これには、次のUIViewControllerようなものも含まれGLKViewControllerます ...

実装:

#import "UIViewController+MyAwesomeExtension.h"
...
[self.viewControllerDerivedClass doSomething];
...

このようなカテゴリには制限があることに注意してください。さらに詳しく知りたい場合は、このテーマをもう少し詳しく調べてみてください。


全体として、「最も」正しい答えは、Mike C.が彼の答えで起草したように、プロトコルを使用して可能な限り多重継承に近づけることだと思います。私の答えは、主に単純なケースの回避策です。

于 2013-03-15T20:59:32.153 に答える