Tôi đang học nhanh chóng. Tôi muốn ghi đè hàm chung trong lớp chung.Làm thế nào để ghi đè lên phương pháp chung trong lớp chung nhanh chóng?
Khi tôi viết override
từ khóa, lỗi biên dịch sẽ xảy ra.
class GenericParent<U> {
func genericFunc<T>(param: T) { print("parent") }
}
class AbsoluteChild: GenericParent<Int> {
override func genericFunc<T>(param: T) { print("child") }
// ! Method does not override any method from its superclass (compile error)
}
Tôi có thể bỏ từ khóa override
. Nhưng khi tôi khai báo kiểu đối tượng là "Cha mẹ", phương thức của cha/mẹ được gọi (không phải phương thức con). Nó không phải là "ghi đè" theo nghĩa đen.
class GenericParent<U> {
func genericFunc<T>(param: T) { print("parent") }
}
class AbsoluteChild: GenericParent<Int> {
func genericFunc<T>(param: T) { print("child") }
}
var object: GenericParent<Int>
object = AbsoluteChild()
object.genericFunc(1) // print "parent" not "child"
// I can call child's method by casting, but in my developing app, I can't know the type to cast.
(object as! AbsoluteChild).genericFunc(1) // print "child"
Trong ví dụ này, tôi muốn nhận được "con" là kết quả của object.genericFunc(1)
. (Nói cách khác, tôi muốn "ghi đè" phương thức.)
Làm cách nào để có được điều này? Có cách giải quyết nào để đạt được điều này không?
Tôi biết rằng tôi có thể gọi phương thức của trẻ bằng cách truyền. Nhưng trong ứng dụng thực tế tôi đang phát triển, tôi không thể biết loại nào được truyền bởi vì tôi muốn làm cho nó đa hình.
Tôi cũng đọc Overriding generic function error in swift bài đăng, nhưng tôi không thể giải quyết vấn đề này.
Cảm ơn bạn!
Nói 'object' là một 'GenericParent 'chỉ cho trình biên dịch biết phương thức và thuộc tính nào có sẵn. Nó không thay đổi lớp từ 'AbsoluteChild' thành' GenericParent '. 'GenericParent ' làm cho phương thức 'genericFunc' có sẵn, nhưng' đối tượng' vẫn là một 'AbsoluteChild'; có nghĩa là khi bạn gọi 'genericFunc', nó sẽ gọi thực hiện của đứa trẻ. Bạn không thể đưa đối tượng vào lớp cha của nó để có được sự thực hiện của cha mẹ. –
keithbhunter
Cảm ơn! Nhưng khi tôi thực hiện mẫu thứ hai tại sân chơi, 'object.genericFunc (1)' in "parent". Nó có nghĩa là thực hiện của cha mẹ được gọi. Làm thế nào tôi có thể hiểu được điều này? –
Ồ, tôi cũng thấy điều đó. Điều đó có vẻ như một lỗi. Bạn có thể gửi nó dưới dạng lỗi cho [bugreport.apple.com] (https://bugreport.apple.com) hoặc tới trang [Swift GitHub] (https://github.com/apple) – keithbhunter