2016-07-14 14 views
7

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!

+0

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

+0

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? –

+0

Ồ, 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

Trả lời

0

Bằng cách khai báo objectGenericParent<Int> bạn hãy đặt nó làm phiên bản của lớp bậc trên.

Bạn có thể xem xét sử dụng giao thức thay vì siêu lớp chung nếu bạn chưa biết chính xác loại thời gian của bạn sẽ chạy. Trong một giao thức, bạn có thể xác định các yêu cầu của đối tượng mà bạn mong đợi.

protocol MyObjectType { 
    func genericFunc<T>(param: T) ->() 
} 

class AbsoluteChild: MyObjectType { 
    func genericFunc<T>(param: T) { 
     print("hello world") 
    } 
} 

var object: MyObjectType 
object = AbsoluteChild() 
object.genericFunc(1)// prints "hello world" 

Nếu bạn vẫn cần một cài đặt mặc định, như bạn sẽ làm gì trong lớp cha GenericParent ban đầu của bạn, bạn có thể làm điều đó trong một phần mở rộng giao thức như vậy:

extension MyObjectType { 
    func genericFunc<T>(param: T) { 
    print("default implementation") 
    } 
} 

class AnotherObject: MyObjectType { 
    //... 
} 

var object2: MyObjectType 
object2 = AnotherObject() 
object2.genericFunc(1)// prints "default implementation" 
+0

Có thực sự in "triển khai mặc định" ở cuối không? Theo như tôi hiểu được câu hỏi, anh ấy muốn một "thế giới chào hỏi" vào thời điểm đó. – jboi

+0

Trong phần mã đầu tiên nó in "hello world". Phần thứ hai tôi đã thêm vào trong trường hợp anh ta cũng cần một sự thực thi mặc định như anh ta sẽ làm trong lớp cha của mình. – Juul

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