カテゴリ
ソースコードが利用できなくても、サブクラス化せずに、既存のクラスの追加メソッドを定義するためにカテゴリを使用できます。通常は、Cocoa フレームワークで定義されているもののように、既存のクラスにメソッドを追加するには、カテゴリを使用します。追加されたメソッドは、サブクラスに継承され、クラスの元のメソッドから実行時には区別できなくなります。また、独自のクラスのカテゴリを使うために使用できます:
- 別々のソースファイルに、独自のクラスの実装を配布 - たとえば、別々のファイルに各々のカテゴリを置き、いくつかのカテゴリに大きなクラスのメソッドをグループ化する事ができます。
- private(プライベート) メソッドを宣言します。
カテゴリの名前の下に、インターフェイスファイルでそれを宣言して、同じ名前で実装ファイルでそれらを定義することによって、クラスにメソッドを追加します。カテゴリの名は、メソッドが別の場所で宣言されたクラスの拡張であり、新しいクラスではないことを示しています。
宣言
カテゴリインターフェイスの宣言は非常に多くのクラスインターフェイスの宣言と似ている - カテゴリの名は括弧内のクラス名にリストされ、スーパークラスは言及されていない事を除いては。カテゴリは、それが拡張するクラスのインターフェイスファイルをインポートする必要があります。
#import "SystemClass.h" @interface SystemClass (CategoryName) // method declarations @end
共通の命名規則は、カテゴリの基本ファイル名がクラスの名前であり、カテゴリの拡張子はカテゴリの名前が"+" の後に続くことです。このカテゴリは SystemClass+CategoryName.h という名前のファイルで宣言されます。
独自のクラスで1つプライベートメソッドを宣言するためにカテゴリを使用する場合は、@ implementation ブロックの前の実装ファイルに宣言を置いて下さい。
#import "MyClass.h" @interface MyClass (PrivateMethods) // method declarations @end @implementation MyClass // method definitions @end
実装
独自のクラスの1つで、プライベートメソッドを宣言するためにカテゴリを使用する場合は、クラスの @ implementation ブロック内に実装を置けます。ソースコードを持っていないクラスを拡張したり、独自のクラスの実装を配布するためにカテゴリを使用する場合は、<ClassName>+CategoryName.m と言う名前のファイルで実装します。実装は、いつものように、独自のインターフェイスをインポートします。カテゴリの実装は、したがって、次のようになります。
#import "SystemClass+CategoryName.h" @implementation SystemClass ( CategoryName ) // method definitions @end
前提条件の記事
関連記事
(なし)
既出の議論
カテゴリは既存のクラスにメソッドを追加
次の章
前の章