回答:
正しい、objective-Cはメソッドのオーバーロードをサポートしていないため、異なるメソッド名を使用する必要があります。
ただし、「メソッド名」にはメソッドシグネチャキーワード(「:」の前にあるパラメーター名)が含まれているため、どちらも「writeToFile」で始まる場合でも、次の2つの異なるメソッドがあることに注意してください。
-(void) writeToFile:(NSString *)path fromInt:(int)anInt;
-(void) writeToFile:(NSString *)path fromString:(NSString *)aString;
(2つのメソッドの名前は「writeToFile:fromInt:」と「writeToFile:fromString:」です)。
Objective-Cがメソッドのオーバーロードをサポートしていなくても、Clang + LLVMがCの関数のオーバーロードをサポートしていることは言及に値するかもしれません。あなたが探しているものではありませんが、状況によっては役立つ場合があります(たとえば、少しハッキングされた(カプセル化に反する)バージョンのビジターデザインパターンの実装)
関数のオーバーロードがどのように機能するかに関する簡単な例を次に示します。
__attribute__((overloadable)) float area(Circle * this)
{
return M_PI*this.radius*this.radius;
}
__attribute__((overloadable)) float area(Rectangle * this)
{
return this.w*this.h;
}
//...
//In your Obj-C methods you can call:
NSLog(@"%f %f", area(rect), area(circle));
id
とisKindOfClass:
、かかわらず、ものの処分で別の話です ...
id
をisKindOfClass:
カバーします。オーバーロードを好む理由の1つは、対応する最も具体的なタイプの自動選択です。これにより、明示的なタイプチェックで維持するためにわずかなオーバーヘッドが発生します。
メソッドのオーバーロードはObjective-Cではサポートされていないという点で、Davidは正しいです。その意味では、PHPに似ています。彼が指摘するように、彼の例のように、シグネチャが異なる2つ以上のメソッドを定義することは一般的な方法です。ただし、「id」タイプを使用して1つのメソッドを作成することもできます。「id」タイプを介して、任意のオブジェクト(およびNSNumberクラスを使用するすべてのプリミティブ)をメソッドに送信し、メソッド自体からそのタイプをテストし、必要に応じて適切な例外をスローできます。これによるパフォーマンスへの影響は軽微ですが、大量のデータを処理している場合を除き、ほとんどの場合わずかであるか、わずかです。
- (void) writeToFile: (NSString *)path fromObject: (id)object {
if (!([object isKindOfClass: [NSNumber class]] || [object isKindOfClass: [NSString class]])) {
@throw [NSException exceptionWithName: @"InvalidArgumentException" reason: @"Unrecognized parameter type." userInfo: nil];
}
}
これは、オブジェクトタイプを適用するプロトコルを実装するための美しい場所でもあります。これは次のように実行できます。
(id<MyProtocol>)object