chữ ký ghi đè trọng số trong phần mở rộng dường như tạo ra kết quả không thể đoán trước trong một số trường hợp nhất định. Ví dụ sau minh họa hai kết quả khác nhau với một mẫu tương tự.Chuyển nhanh đến các phương thức ghi đè trong phần mở rộng phân lớp
class A: UIViewController {
func doThing() {
print("dothing super class")
}
override func viewDidLoad() {
print("viewdidload superclass")
super.viewDidLoad()
}
}
class B: A { }
extension B {
override func doThing() {
print("dothing sub class")
super.doThing()
}
override func viewDidLoad() {
print("viewdidload subclass")
super.viewDidLoad()
}
}
let a: A = B()
a.doThing()
let vc: UIViewController = B()
vc.viewDidLoad()
in này:
dothing super class
viewdidload subclass
viewdidload superclass
Bạn có thể thấy điều này bỏ qua việc thực hiện các doThing
các 's B
khi nó được chọn vào vai A
, tuy nhiên bao gồm cả việc triển khai của viewDidLoad
khi vào vai UIViewController
. Đây có phải là hành vi dự kiến? Nếu vậy, lý do cho việc này là gì?
VIV: Xcode 7.3, Sân chơi
Thử 'dynamic func doThing()' trong lớp cha. – jtbandes
@jtbandes Điều đó tạo ra kết quả mong đợi (ví dụ: các cuộc gọi cả triển khai lớp con và triển khai siêu lớp). Nhưng tôi không rõ ràng về lý do tại sao mà sẽ được yêu cầu và khác với hành vi khi cast vào 'UIViewController'. Các hành vi có khác nhau dựa trên phạm vi mô-đun không? – ahtierney