0

UIGestureRecognizerを使用した次のコード:

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

[self.view addGestureRecognizer:gestureRecog];

実際にコンパイルして実行できます。抽象クラスはインスタンス化できないと 思いましたか?

4

2 に答える 2

5

抽象クラスはObjective-Cの言語機能ではないため(たとえば、Javaとは異なり)、コンパイラーが強制できるものではありません。

ドキュメントでクラスが抽象としてマークされている場合、それはそれがどのように使用されることを意図しているかのヒントにすぎませんが、ランタイムもコンパイラも実際にクラスを直接インスタンス化することを妨げません。

Objective-Cプログラミング言語ガイドの抽象クラスに関するセクションでNSViewは、これはサブクラス化せずに使用できる抽象クラスの例であると実際に述べているため、その概念自体は他の言語/フレームワークほど厳密ではありません。

于 2012-04-29T00:18:54.333 に答える
1

omzの答えをありがとう。これは、Appleのドキュメントからの関連する抜粋です。

抽象クラス

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

他のいくつかの言語とは異なり、Objective-Cには、クラスを抽象としてマークする構文がなく、抽象クラスのインスタンスを作成できなくなることもありません。

NSObjectクラスは、Cocoaの抽象クラスの標準的な例です。アプリケーションでNSObjectクラスのインスタンスを使用することは決してありません。これは何の役にも立ちません。これは、特に何もしない機能を備えた汎用オブジェクトになります。

一方、NSViewクラスは、抽象クラスの例を提供します。このインスタンスは、場合によっては直接使用することがあります。

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

于 2012-04-29T00:32:26.840 に答える