2015-09-23 32 views
6

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?

+0

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 –

Trả lời

3

Mùi giống như một con bọ.

Cách giải quyết duy nhất mà tôi đã đưa ra rất xấu xí ...

protocol E { 
    func test() 
} 

func E_test(_s: E) { 
    print("jello") 
} 

extension E { 
    func test() { E_test(self) } 
} 

class A: E { 
    func test() { E_test(self) } 
} 

class B: A { 
    override func test() { 
     print("hello") 
    } 
} 

let b: A = B() 
b.test() 
+0

Đây thực sự là giải pháp , nhưng rất xấu xí :) Sẽ gửi một radar chỉ để đảm bảo. –

+0

Nó không phải là một lỗi, đó là hành vi dự định. Tuy nhiên, tôi đang chiến đấu với vấn đề này ngay bây giờ :) – manmal

+0

@manmal Nếu Apple dự định này, nhưng tất cả các lập trình viên thấy nó phản trực giác và kết thúc hack xung quanh nó, sau đó tôi nghĩ rằng nó có thể được phân loại như là một lỗi. – mogelbuster

Các vấn đề liên quan