2010-09-08 27 views
7

Chức năng quá tải có thể xảy ra trong Mục tiêu C không?
Vâng, Hầu hết các lập trình viên nói không,
Nhưng có vẻ như có thể,
ví dụ:Chức năng quá tải có thể xảy ra trong Mục tiêu C không?

-(int)AddMethod:(int)X :(int)Y 
{ 
    return X + Y; 
} 
-(int)AddMethod:(int)X 
{ 
    return X; 
} 

để gọi 1 ai viết [self AddMethod :3];
để gọi người cuối cùng viết [self AddMethod: 3 :4];

+0

tôi đã đọc nhiều lần các lập trình viên nói rằng chức năng quá tải là không thể trong mục tiêu C. – Matrix

+0

tôi phải không? .... – Matrix

+6

Đây không phải là quá tải, phương pháp của bạn có các bộ chọn khác nhau (= tên). Một là 'AddMethod:' và cái kia là 'AddMethod ::' – Sven

Trả lời

22

Không thể nạp chồng phương pháp trong Mục tiêu-C. Tuy nhiên, ví dụ của bạn thực sự sẽ hoạt động vì bạn đã tạo hai phương thức khác nhau với các bộ chọn khác nhau: -AddMethod::AddMethod:. Có một dấu hai chấm cho mỗi tham số xen kẽ. Việc đặt một số văn bản cũng là điều bình thường, ví dụ: -addMethodX:Y: nhưng bạn không phải làm vậy.

+1

Bạn không * có * để gắn nhãn tham số thứ hai, nhưng thực sự ... bạn phải làm như vậy. Không có lý do gì để làm cho mã của bạn cố tình bị nguyền rủa. – kubi

+2

@kubi: Hoàn toàn đồng ý. Đó là cùng một loại "không cần phải" như trong "bạn không cần phải sử dụng chữ cái trong tên biến C, bạn chỉ có thể sử dụng chuỗi gạch dưới". – JeremyP

+0

im nhầm lẫn ... tôi nghĩ rằng tính là quá tải phương pháp (hoặc số khác nhau của các đối số hoặc các loại) EDIT: ok, có vẻ như chỉ có các loại đếm là quá tải cho các bạn ...Trong rất nhiều ví dụ trực tuyến, tôi thấy rằng số lượng chữ ký khác nhau là "quá tải". Thở dài... – dtc

4

Không, nó không phải là, chủ yếu là vì Objective-C không sử dụng các hàm, nó sử dụng các phương thức.

Quá tải phương thức, mặt khác, có thể. Sắp xếp.

xem xét, nếu bạn sẽ, một lớp học với một phương pháp lấy một cuộc tranh cãi về hình thức hoặc là một NSString * hoặc một const char *:

@interface SomeClass : NSObject { 

} 

- (void)doThingWithString:(NSString *)string; 
- (void)doThingWithBytes:(const char *)bytes; 

@end 

Trong khi phương pháp riêng của mình sẽ không đi xung quanh việc lựa chọn các phương pháp thích hợp với một đầu vào đã cho; người ta vẫn có thể nói rằng doThing: đã bị quá tải, ít nhất theo nghĩa là hai phương pháp lấy một tham số khác nhau để đạt được cùng một chức năng.

+2

Nó có ý nghĩa gì với 15.? – vodkhang

+0

Các câu trả lời phải dài ít nhất 15 ký tự; vì vậy tôi đã ăn thịt tôi một chút. ;) –

+5

Ví dụ này không phải là ngay cả * loại quá tải *, đó chỉ đơn giản là hai phương thức khác nhau mà việc đặt tên ngụ ý một số mối quan hệ ngữ nghĩa. Nó chỉ là lựa chọn thường được sử dụng trong trường hợp không quá tải. –

2

Về mặt kỹ thuật, quá tải phương thức không thể thực hiện trong Mục tiêu-C. Trong thực tế, bạn thường có thể đạt được kết quả tương tự, cũng trong trường hợp bạn không thể trong C++. Trong Objective-C, các tên phương thức bao gồm dấu hai chấm ở phía trước của mỗi đối số, và dấu hai chấm là một phần của tên phương pháp, có nghĩa là ví dụ của bạn sử dụng các tên phương thức khác nhau. Trong thực tế, điều này trở thành một loại chức năng giả-tên-tham số, và bạn có thể nhận được một quá tải giả phương thức bởi đối số FUNCTION hơn là đối số TYPE. Trong hầu hết các trường hợp, điều này thực sự sẽ hữu ích hơn, nhưng nó không phải là quá tải phương thức theo nghĩa hẹp, bởi vì các tên phương thức khác nhau.

Ví dụ:

-(void)makeSquareWithX1:(float)x1 Y1:(float)y1 X2:(float)x2 Y2:(float)y2; 
-(void)makeSquareWithX1:(float)x1 Y1:(float)y1 width:(float)width height:(float)height; 

này sẽ làm việc trong Objective-C, nhưng bạn không thể có được chức năng tương tự trong C++, bởi vì số lượng tham số và các loại là, chỉ có chức năng tương tự đối số khác nhau. Trong một số trường hợp, mô hình C++ có thể đạt được nhiều chức năng hữu ích hơn. Điều này được chứng minh bởi lớp NSKeyedArchiver:

-(void)encodeFloat:(float)realv forKey:(NSString *)key 
-(void)encodeInt32:(int32_t)intv forKey:(NSString *)key 

Ở đây, họ phải đặt các loại đối số một phần tên moethod, điều xấu xí. Nếu tôi có thể chọn giữa quá tải C++ và Objective-C "overloading", tôi vẫn sẽ chọn thứ hai.

-1

danh mục cung cấp một cách khác để bắt chước c-phong cách phương pháp quá tải trong Objective C. Như một ví dụ, hãy xem xét các tờ khai giao diện sau:

@interface MyClass 
{ 
} 
@end 

@interface MyClass (MethodVersion1) 
- (void) doSomething : (int) val; 
@end 

@interface MyClass (MethodVersion2) 
- (void) doSomething : (double) val; 
@end 

Các loại thông số khác nhau được giải quyết bằng các hạng mục.

2

Bạn có thể bắt đầu với một phương pháp chung chung mà tìm đường khác dựa vào loại đối tượng bạn vượt qua trong.

- (void)doSomething:(id)obj; 

Sau đó, bạn có thể kiểm tra các loại để xem nếu nó NSData hoặc UIImage và tuyến đường đó trong nội bộ để phương pháp thích hợp.

- (void)doSomethingWithData:(NSData *)data; 
- (void)doSomethingWithImage:(UIImage *)image; 

Bạn cũng có thể chọn chỉ hỗ trợ các loại dự kiến ​​và từ chối một cách duyên dáng để xử lý các loại không được hỗ trợ hoặc không rõ ràng.

Tra cứu NSAssert1, NSAssert2, v.v. để có cách tiếp cận khác.

0

Lưu ý rằng nếu bạn cần/muốn chức năng quá tải khi kết hợp Objective-C với C++ thì có thể. Tôi chỉ đề cập đến điều này bởi vì trong XCode bạn cần phải thay đổi tập tin .m của bạn thành một tập tin .mm để xử lý nó theo cách này, điều này đã khiến tôi mất một vài phút.

tiêu đề

Ví dụ:

void addMethod(NSInteger a); 
void addMethod(NSInteger a, NSInteger b); 

Nếu bạn đang kể cả điều này trong một tập tin .m bạn sẽ nhận được một cảnh báo:

mâu thuẫn loại cho 'addMethod'

Thay đổi tệp .m của bạn thành tệp .mm sẽ xóa sự cố.

0

Bạn có thể quá tải các hàm C với các trình biên dịch mới hơn - Cú pháp hơi phức tạp (không có gì nhanh chóng sửa lỗi), nhưng nó hoạt động tốt.

function overloading in C

Các vấn đề liên quan