Vì vậy, tôi đã suy nghĩ về một mô hình tùy chỉnh trong dự án của tôi, nhưng tôi không thể làm cho nó hoạt động. Ý tưởng chính là thay đổi typealias
trên mọi lớp con để có quyền truy cập vào giao diện cụ thể của lớp con.Swift: ghi đè typealias bên trong phân lớp
protocol InstanceInterface: class {
typealias Interface
var interface: Interface { get }
}
// Baseclass
protocol FirstClassInterface: class { /* nothing here for the example */ }
class FirstClass: InstanceInterface, FirstClassInterface {
typealias Interface = FirstClassInterface
var interface: Interface { return self }
}
// Subclass
protocol SecondClassInterface: FirstClassInterface {
func foo()
}
class SecondClass: FirstClass, SecondClassInterface {
typealias Interface = SecondClassInterface // <--- This does nothing :(
func foo() { print("hello world") } // Swift 2.0 here
}
// Lets say I want to call foo trough the interface
let test = SecondClass()
test.interface.foo() // 'Interface' does not have a member named 'foo'
Có điều gì đó tôi đang làm sai hoặc tôi hiểu nhầm một số khái niệm Swift ở đây ?! Tôi cần phải phân lớp ở đây để không thực hiện mọi thứ từ các giao thức của siêu lớp lặp đi lặp lại. Là mô hình nhỏ của tôi thậm chí có thể? Tôi đánh giá cao sự giúp đỡ nào. :)
Tôi thấy điểm này ngay bây giờ. Nhưng vẫn còn có một số loại lỗi hoặc cảnh báo nếu bạn ghi đè lên các typealias bên trong lớp con !? Tôi có nghĩa là nó không có gì, ngay cả đối với ví dụ của bạn nó vẫn sẽ dính vào FirstClass bên trong SecondClass, hoặc tôi lại sai? Điểm đáng chú ý là gì? – DevAndArtist
@DevAndArtist Vấn đề là một 'typealias' không thể bị ghi đè và nếu bạn khai báo một cái mới có cùng tên như trong' SecondClass' nó sẽ đổ bóng cái kia. Điều này có nghĩa là 'T' nằm trong phạm vi' SecondClass' một kiểu khác nhưng không thay đổi 'T' của' FirstClass'. – Qbyte