Objective-Cでのメソッドのオーバーロード?


131

私の知る限り、Objective-Cはメソッドのオーバーロードをサポートしていません。Objective-Cでこれに代わるものは何ですか?または、常に別のメソッド名を使用する必要がありますか?

回答:


193

正しい、objective-Cはメソッドのオーバーロードをサポートしていないため、異なるメソッド名を使用する必要があります。

ただし、「メソッド名」にはメソッドシグネチャキーワード(「:」の前にあるパラメーター名)が含まれているため、どちらも「writeToFile」で始まる場合でも、次の2つの異なるメソッドがあることに注意してください。

-(void) writeToFile:(NSString *)path fromInt:(int)anInt;
-(void) writeToFile:(NSString *)path fromString:(NSString *)aString;

(2つのメソッドの名前は「writeToFile:fromInt:」と「writeToFile:fromString:」です)。


4
@RaheelSadiqメソッド名(ObjCでは「セレクター」)が異なるため、オーバーロードされません。異なるので、どちらも「過負荷」とは見なされません。writeToFile:from:が2度定義され、パラメータータイプのみが異なる場合、それはオーバーロードになります。ただし、前述のように、Javaや現在のSwiftを含む他の言語とは異なり、これはObjCではサポートされていません。
Chris Hatton

パラメータ名自体だけでなく、コロンもメソッド名の一部であるため、-(void)writeToFile:(NSString *)path:(int)anInt; および-(void)writeToFile:(NSString )path:(NSString)aString;も異なるメソッドです。
Kaiserludi 2015年

22

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));

一つは、メソッドスウィズリングと組み合わせて、このヒントは、確かに1がで、する必要がありますなぜ「オーバーロード」方法...につながる可能性があると思うだろうidisKindOfClass:、かかわらず、ものの処分で別の話です ...
アレックス・グレイ

1
@alexgray私はあなたの要点を理解し、 ほとんどの実際的なシナリオidisKindOfClass:カバーします。オーバーロードを好む理由の1つは、対応する最も具体的なタイプの自動選択です。これにより、明示的なタイプチェックで維持するためにわずかなオーバーヘッドが発生します。
Chris Hatton

1
Clangのドキュメントでは、CのC ++名のマングルを提供することを明示的に述べています。これは、基本的に、コンパイラーがObjective-Cで行う処理を背後で自動的に実行することで、(長い形式で)囲むことで異なるメソッド名を指定することによって行われます。引数のタイプ。
Chris Stratton

19

メソッドのオーバーロードは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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.