Jawaban:
Benar, objektif-C tidak mendukung kelebihan metode, jadi Anda harus menggunakan nama metode yang berbeda.
Namun, perhatikan bahwa "nama metode" mencakup kata kunci tanda tangan metode (nama parameter yang muncul sebelum ":"), jadi berikut adalah dua metode yang berbeda , meskipun keduanya memulai "writeToFile":
-(void) writeToFile:(NSString *)path fromInt:(int)anInt;
-(void) writeToFile:(NSString *)path fromString:(NSString *)aString;
(nama kedua metode tersebut adalah "writeToFile: fromInt:" dan "writeToFile: fromString:").
Mungkin perlu disebutkan bahwa bahkan jika Objective-C tidak mendukung metode overloading, Dentang + LLVM mendukung fungsi overloading untuk C. Meskipun tidak sesuai dengan yang Anda cari, itu bisa terbukti berguna dalam beberapa situasi (misalnya, ketika menerapkan versi yang sedikit diretas (bertentangan dengan enkapsulasi) dari pola desain pengunjung )
Berikut adalah contoh sederhana tentang cara kerja kelebihan fungsi berfungsi:
__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
dan isKindOfClass:
pada saat pembuangan, adalah cerita yang berbeda ...
id
dan isKindOfClass:
membahas sebagian besar skenario praktis. Salah satu alasan Anda mungkin lebih suka kelebihan beban, adalah pemilihan otomatis dari jenis yang paling spesifik dipenuhi, yang akan menyebabkan overhead kecil untuk mempertahankan dengan pengecekan tipe eksplisit.
David benar dalam metode overloading yang tidak didukung di Objective-C. Ini mirip dengan PHP dalam pengertian itu. Seperti yang dia tunjukkan, adalah praktik umum untuk mendefinisikan dua atau lebih metode dengan tanda tangan yang berbeda dalam cara dia contoh. Namun, dimungkinkan juga untuk membuat satu metode menggunakan tipe "id". Melalui tipe "id", Anda dapat mengirim objek apa pun (dan primitif apa pun menggunakan kelas NSNumber) ke metode dan kemudian dari dalam metode itu sendiri Anda dapat menguji jenisnya dan melemparkan pengecualian yang sesuai jika perlu. Meskipun ini memiliki hit kinerja kecil, kemungkinan besar akan nominal atau tidak signifikan kecuali Anda sedang memproses data dalam jumlah besar.
- (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];
}
}
Ini juga merupakan tempat yang indah untuk mengimplementasikan protokol untuk menegakkan tipe objek, yang dapat dilakukan seperti:
(id<MyProtocol>)object