Các loại ý tưởng lớp cha, trong khi một lý thuyết tốt, không thực sự đứng dậy: Một NSString *
là một NSObject *
. Không có lý do gì nó không thể được gọi là như vậy.
Thay vào đó, tôi nghĩ rằng nó có nhiều việc phải làm với chữ ký chức năng. Trong một ngôn ngữ động như Objective-C, bạn không thể biết bạn đang nhắn tin với lớp nào. Nhưng trình biên dịch phải biết loại nào đang được trả về. Lịch sử của chương trình dựa trên quy ước và mục tiêu đó (thay vì có quy tắc nghiêm ngặt) có nghĩa là lớp con của bạn có thể trả lại NSRect
(a struct
) hoặc NSInteger
(vô hướng) từ init
. Đó là kooky, nhưng hợp lệ.
C++ có vấn đề tương tự, xem Is the return type part of the function signature?. Vì vậy, chúng tôi cần một loại duy nhất cho tất cả các phương pháp có chữ ký là -(id)init
và id
là điều duy nhất có ý nghĩa vì nó chỉ quy định loại trả về là một cá thể. Đó là đủ cho trình biên dịch để làm điều đúng. Bây giờ chúng tôi có instancetype
, phù hợp với lớp học được nhắn tin.
Nguồn
2013-05-06 23:09:58
Kính gửi người đó đã bình chọn câu hỏi này khoảng 7 giờ trước, nếu bạn định downvote một câu hỏi, dựa trên số lượng upvotes và yêu thích, rõ ràng đã giúp nhiều người hiểu về Objective-C, , ít nhất thêm một bình luận là tại sao ... –