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)'
Vì 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?
Đ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'. –
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ệ. –
@SeamusCampbell Xin lỗi, tôi đã không đọc hết những gì bạn đã viết. Đúng chính xác. – CodaFi