Trong ngôn ngữ Swift, để khởi tạo một thể hiện, người ta phải điền vào tất cả các trường của lớp đó và chỉ sau đó gọi siêu cấu trúc:
class Base {
var name: String
init(name: String) {
self.name = name
}
}
class Derived: Base {
var number: Int
init(name: String, number: Int) {
// won't compile if interchange lines
self.number = number
super.init(name)
}
}
Đối với tôi nó có vẻ ngược, bởi vì cá thể cần self
được tạo trước khi gán giá trị cho các trường của nó và mã đó tạo ấn tượng như thể chuỗi chỉ xảy ra sau khi gán. Ngoài ra, siêu lớp không có phương tiện hợp pháp để đọc các thuộc tính được giới thiệu của lớp con của nó, vì vậy tính an toàn không được tính trong trường hợp này.
Ngoài ra, nhiều ngôn ngữ khác, như JavaScript và thậm chí cả Objective C, vốn là tổ tiên tinh thần của Swift, yêu cầu gọi chuỗi trước khi truy cập self
, không phải sau đó.
Lý do đằng sau sự lựa chọn này để yêu cầu các trường được xác định trước khi gọi siêu cấu trúc là gì?
self
.