|
|
Log In | Not a Member? |
Contact ADC |
| < 前ページ次ページ > |
クラス拡張は「匿名」のカテゴリに似ていますが、宣言するメソッドを対応するクラスのメイン@implementationブロックで実装しなければならない点が異なります。
クラスには、パブリックに宣言されたAPIと、そのクラスまたはそのクラスが含まれるフレームワークだけで使用するためのプライベートに宣言された追加のAPIがあるのが一般的です。プライベートヘッダファイル内または上記で説明した実装ファイル内のカテゴリ(または複数のカテゴリ)内でこうしたAPIを宣言できます。これは有効ですが、コンパイラは宣言されたメソッドがすべて実装されていることを検証できません。
たとえば、コンパイラは次の宣言と実装をエラーなしでコンパイルします。
@interface MyObject :NSObject |
{ |
NSNumber *number; |
} |
- (NSNumber *)number; |
@end |
@interface MyObject (Setter) |
- (void)setNumber:(NSNumber *)newNumber; |
@end |
@implementation MyObject |
- (NSNumber *)number |
{ |
return number; |
} |
@end |
setNumberメソッドの実装がないことに注意してください。これが実行時に呼び出されると、エラーが発生します。
クラス拡張を使用すると、プライマリクラスの@interfaceブロック内以外の場所でクラスに追加の必須APIを定義できます。次の例を参照してください。
@interface MyObject :NSObject |
{ |
NSNumber *number; |
} |
- (NSNumber *)number; |
@end |
@interface MyObject () |
- (void)setNumber:(NSNumber *)newNumber; |
@end |
@implementation MyObject |
- (NSNumber *)number |
{ |
return number; |
} |
- (void)setNumber(NSNumber *)newNumber |
{ |
number = newNumber; |
} |
@end |
次に注意してください。
2番目の@interfaceブロックの括弧内に名前が指定されていない。
setNumberメソッドの実装が、クラスの主要な@implementationブロックに含まれていません。
setNumberメソッドの実装は、クラスのメインの@implementationブロックに必ず含まれていなければなりません(カテゴリ内で実装できません)。そうでなければ、コンパイラからsetNumberのメソッド定義が見つからないという警告が出されます。
| < 前ページ次ページ > |
Last updated: 2007-10-31
|
Get information on Apple products.
Visit the Apple Store online or at retail locations. 1-800-MY-APPLE Copyright © 2007 Apple Inc. All rights reserved. | Terms of use | Privacy Notice |