2012-04-29 11 views
0

UIGestureRecognizerを使用して、次のコード:iOSでは、UIGestureRecognizerは抽象クラスの場合、なぜインスタンス化できますか?

UIGestureRecognizer *gestureRecog = [[UIGestureRecognizer alloc] 
             initWithTarget:self 
             action:@selector(handletap:)]; 

[self.view addGestureRecognizer:gestureRecog]; 

が実際にコンパイルして実行することができます。私はabstract classはインスタンス化できないと思った?

答えて

5

抽象クラスはObjective-Cの言語機能ではありません(たとえばJavaとは異なります)。したがって、コンパイラが実行できるものではありません。

ドキュメントに抽象クラスとしてマークされている場合は、の使用方法はとなりますが、ランタイムもコンパイラも実際に直接インスタンス化することはできません。

のObjective-Cプログラミング言語ガイドでabstract classes上のセクションでは、実際にNSViewあなたは時々、サブクラス化せずに使用することができます抽象クラスの一例ですので、のような概念は他の言語/フレームワークほど厳格ではないと述べています。

1

omzさんのお返事ありがとうございます。これは、Appleのドキュメントから関連の抜粋です。他のクラスは 彼らから継承できるように

抽象クラス

は、一部のクラスは、のみ、または主に設計されています。これらの抽象クラスは、多くのサブクラスで共通の 定義に使用できるメソッドとインスタンス の変数をグループ化します。抽象クラスは通常、それ自体では不完全ですが、 にはサブクラスの実装の負担を軽減する便利なコードが含まれています。 (抽象クラ​​スが有用 するサブクラスを持っている必要があるため、彼らは時々、抽象スーパークラスと呼ばれている。)

いくつかの他の言語とは異なり、Objective-Cのは、抽象として クラスをマークする構文を持っていません。また、あなたを防ぐん抽象クラスのインスタンス の作成から

NSObjectクラスは、 ココアの抽象クラスの正規の例です。 アプリケーションでNSObjectクラスのインスタンスを使用することは決してありません。特に何もしないことができる汎用の オブジェクトになります。

NSViewクラスには 抽象クラスの例がありますが、時には というインスタンスを使用することもあります。

抽象クラスには、アプリケーションの構造を定義するのに役立つコードが含まれていることがあります。 これらのクラスのサブクラスを作成すると、新しいクラスのインスタンス が簡単にアプリケーション構造 に収まり、他のオブジェクトと自動的に連携します。

関連する問題