Tôi đang gặp phải sự cố liên quan đến việc gửi phương thức giao thức.Gửi phương thức mở rộng giao thức trong Swift 2.0
Tôi có một hệ thống phân cấp lớp trông như thế:
protocol E {
func test()
}
extension E {
func test() {
print("jello")
}
}
class A: E {
}
class B: A {
func test() {
print("hello")
}
}
Nhưng khi tôi gọi test
trên một thể hiện của lớp B
tĩnh buộc phải được đánh máy A
, "jello" được in, không phải "xin chào".
let b: A = B() // prints "jello" not "hello"
b.test()
sự hiểu biết của tôi là test
phương pháp in ấn "jello" được "tích hợp" vào trường hợp của A
(kể từ A
phù hợp với E
giao thức). Sau đó, tôi cung cấp một triển khai khác của test
bên trong B
(kế thừa hình thức A
). Tôi nghĩ rằng đa hình sẽ làm việc ở đây và gọi test
trên B
trường hợp được lưu trữ bên trong tài liệu tham khảo A
sẽ in hello
. Điều gì đang xảy ra ở đây?
Nó hoàn toàn làm việc khi không sử dụng bất kỳ giao thức:
class A {
func test() {
print("jello")
}
}
class B: A {
override func test() {
print("hello")
}
}
let b: A = B() // prints "hello"
b.test()
Có gì khác biệt so với việc áp dụng một giao thức có thêm phương pháp mới để lớp cha mẹ tôi và cung cấp một thực hiện mới trong một lớp con, vì phải trực tiếp bằng văn bản phương pháp này trong lớp cha và sau đó ghi đè nó trong một lớp con?
Các bạn có giải pháp nào không?
Không phải hành vi chính xác mà bạn đang thấy, nhưng liên quan chặt chẽ: http://nomothetis.svbtle.com/the-ghost-of-swift-bugs-future –