2013-03-06 14 views
7

Nếu tôi có các đối tượng sau:Mục tiêu-C: Làm thế nào để vượt qua một đối tượng như là một đối số khối để một phương pháp dự kiến ​​lớp cơ sở của nó?

@interface Simple : NSObject 

@end 

@interface Complex : Simple 

@end 

Và một đối tượng như:

@interface Test : NSObject 

+(void) doSomething:(void (^)(Simple*)) obj; 

@end 

Tất cả mọi thứ hoạt động nếu tôi gọi là phương pháp như:

[Test doSomething:^(Simple * obj) { 

}]; 

Khi tôi cố gắng thay vì gọi nó như:

[Test doSomething:^(Complex * obj) { 

}]; 

Trình biên dịch nói rằng:

Incompatible block pointer types sending 'void (^)(Complex *__strong)' to parameter of type 'void (^)(Simple *__strong)'

Complex kéo dài Simple, tôi nghĩ điều này sẽ làm việc, giống như trong Java.

Có cách nào để đạt được điều này bằng cách nào đó không?

Trả lời

8

Thật không may, đây là một hạn chế của API khối. Nếu bạn muốn, bạn có tùy chọn an toàn loại bỏ hoàn toàn và tuyên bố khối là:

+(void) doSomething:(void (^)(id)) obj; 

Cho phép bạn đặt lớp đối số của khối. Nhưng một lần nữa, đây là hoàn toàn không an toàn, loại khôn ngoan.

+0

Điều này thực sự không may? 'Test' yêu cầu và lấy một tham chiếu tới một khối có chữ ký cho biết khối nhận một đối số kiểu' Simple'. Việc giao cho nó một khối có một kiểu con 'Complex' có thể có nghĩa là' Test' có thể thực hiện một cuộc gọi bất hợp pháp bằng cách gọi khối đó với một lớp con khác của 'Simple'. –

+0

Tôi chỉ nói rằng có vẻ hợp lý khi gọi đây là vi phạm hợp đồng. Nếu không, trình biên dịch không thể biết nếu có bất kỳ cuộc gọi nào trong 'Test' để thực thi khối có tham số hợp lệ. –

+0

@SeamusCampbell Xin lỗi, tôi đã không đọc hết những gì bạn đã viết. Đúng chính xác. – CodaFi

2

Sử dụng id thay vì Complex * hoặc Simple *. Các kiểu tham số khối được xử lý khác với các kiểu tham số phương thức (nhờ @CodaFi)

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