2013-03-15 9 views
9

私はクラス iPhoneアプリを持っているがのUIViewControllerのサブクラスである:カスタムクラスを複数のスーパークラスから継承させるにはどうすればよいですか?

enter image description here

今、私は再利用Aしたい新しいアプリを作成しています、しかし、それは結構ですB、からサブクラス化していBサブクラスからのUIViewController理由:

enter image description here

しかし、今、私は別のクラス、GLKViewControllerのサブクラスであるCを、持っている:

enter image description here

私が再第三アプリを作るしようとすると、問題が来ますBをそのまま使用します。

enter image description here

からのUIViewControllerB継承しているので、私は何とかそれがBから、私は多重継承の場合であると考えていGLKViewController、継承すべきであることをCを伝える必要があります

これを処理する最良の方法は、の構成ですが、私はそれを自分の状況に最もよく適用する方法を理解していませんn。待機中の溶液として

、私はちょうど私は、手元のタスクに適したスーパークラスからサブクラス化するアプリごとアプリ基づいて変更することができラッパークラスDを作成することができ実現。

enter image description here

enter image description here

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

+0

UIScrollViewControllerとは何ですか? – jrturton

+1

サブクラス化する代わりにUIViewControllerでカテゴリを使用するのはどうですか? UIScrollViewControllerはUIViewControllerを継承するため、カテゴリはUIScrollViewControllerのインスタンスの場合でも使用できます。 Ow、そして本当によく書かれた質問+1! – Till

+3

Objective-Cでこれを行うことはできません - Javaのような単一の継承 - 構成または委任のパラダイムを使用 –

答えて

7

目的Cは単一継承のみをサポートします。この場合、おそらく共通の機能にプロトコルを使用したいと思うでしょう。ヘルパーオブジェクトを使用してプロトコルメソッドを実装できます。この場合、オブジェクトが特定のクラスのメンバであるかどうかは関係ありませんが、特定のメソッドセットを実装しているかどうかは関係ありません。

+1

「あなたのオブジェクトが特定のクラスのメンバであるかどうかに関心がない」と言ったとき、UIViewControllerまたはB?私はインスタンス変数とメソッドにアクセスできるという点で、両方のクラスの一部であることに実際に関心を持っています。 – todd412

+0

正しいプロトコルでは、同様の機能を複数の継承に使用できます。残念なことに、デフォルトの実装は許可されていないため、クラスのクラスター(ヘルパーオブジェクトと呼ばれる)に依存する、コードの重複を避けることができます。とにかく、外部の視点からは、これは素晴らしい代替品になる可能性があります。 – Till

3

あなたはObjective-Cでこれを行うことはできません。これはjavaや他の現代の言語のような単一の継承です。

は、あなたは、おそらくそれは、カテゴリを使用することによってカバーされ得ることができ、組成物または委任

+0

固定コメント - 削除されたコメントを –

+1

から削除しました...恐れがあると思われるコメントを削除しました...:D – Till

1

のパラダイムを使用します。確かに複数の継承と同じではありませんが、時にはその仕事をします。

カテゴリのサンプルをドラフトして、それがあなたが目指すものがあるかどうかを見てみましょう。

ヘッダー:UIViewController+MyAwesomeExtension.h

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

実装:今、あなたはまた、例えばのように含まれてあなたのUIViewControllerサブクラスの1つの中からそれを使用しているUIViewController+MyAwesomeExtension.m

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

GLKViewController ...

実装:そのようなカテゴリには、その限界を持っていることを

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

注意。もっと調べるには、対象をもう少し詳しく調べてみてはいかがですか。全体的に


、私はマイク・C.は彼の答えに起草として「最も」正しい答えは、可能な限り多重継承に近い取得するためのプロトコルを使用していると思います。私の答えは、ほとんどの場合単純なケースの回避策です。

+0

ありがとうございます。カテゴリがこのトリックを行うことは間違いです.-クラスAは依存していますインスタンス変数とインスタンスメソッドの両方をBとUIViewController(またはGLKViewController)から継承し、Aも.xibファイルのFile's Ownerになります。カテゴリがこれらすべてのことを行うことができるかどうかは不明です。 – todd412

関連する問題