2011-12-23 54 views
9

Giả sử tôi có lớp B bắt nguồn từ lớp ARuby: Gọi phương thức ghi đè của lớp cha, trong lớp con

Có thể gọi phương thức ghi đè của A như thế này không?

class A 
    def method1 
    end 
    def method2 
    end 
end 

class B < A 
    def method1 
    ### invoke method2 of class A is what I want to do here 
    end 
    def method2 
    end 
end 

# không trùng lặp chính xác với How do I call an overridden parent class method from a child class?, nhưng chúng tôi có vẻ muốn làm điều tương tự.

+3

Ý của bạn là B là lớp con của A trong mã ví dụ? – sepp2k

+1

nếu b là một phân lớp của một sau đó bạn chỉ có thể gọi siêu từ bên trong b mehtod của bạn. – three

+1

Không, anh ta cần gọi phương thức super2 từ phương thức của hậu duệ1. Không có cách nào (mà tôi biết) trong Ruby để làm điều này. –

Trả lời

16

Tôi giả định ở đây rằng B được cho là kế thừa từ A và bạn chỉ cần thực hiện lỗi đánh máy trong mã ví dụ của mình. Nếu đây không phải là trường hợp, không có cách nào để làm những gì bạn muốn.

Nếu không, bạn có thể làm những gì bạn muốn sử dụng phản ánh bằng cách liên kết phương pháp method2 dụ A 's để đối tượng B hiện tại của bạn và gọi nó như thế này:

class A 
    def method1 
    end 
    def method2 
    end 
end 

class B < A 
    def method1 
    A.instance_method(:method2).bind(self).call 
    end 
    def method2 
    end 
end 

Lưu ý rằng mặc dù bạn không nên kéo ra lớn súng đen như thế này trừ khi bạn thực sự cần. Trong hầu hết các trường hợp, việc thiết kế lại hệ thống phân cấp lớp của bạn để bạn không cần phải làm điều này là sự lựa chọn tốt hơn.

+0

Cảm ơn. Một phép thuật khác lừa lên tay áo của tôi :-) –

+0

+1 Tôi đã đăng cùng một thứ. Tôi cũng nghĩ rằng điều này hiếm khi, nếu cần, cần phải được sử dụng. Tại sao ghi đè lên một phương pháp # 2 nếu bạn vẫn cần nó trong B? Tôi chỉ sử dụng mẹo liên kết khi cố khắc phục các hành vi của phương pháp, ví dụ: trong irb. – Kelvin

9

Bạn có thể tạo một từ đồng nghĩa với phương pháp mẹ sử dụng alias tuyên bố và gọi nó là từ phương pháp overriden:

class A 
    def method1 
    puts '1' 
    end 
    def method2 
    puts '2' 
    end 
end 

class B < A 
    alias parent_method1 method1 
    alias parent_method2 method2 
    def method1 
    parent_method2 
    end 
    def method2 
    end 
end 

b = B.new 
b.method1 # => 2 
5

Câu trả lời của @ sepp2k là đúng về mặt kỹ thuật, tuy nhiên tôi muốn giải thích lý do tại sao kỹ thuật này không phải là thích hợp theo ý kiến ​​của tôi (vì vậy câu hỏi là về mặt kỹ thuật thú vị, nhưng dẫn đến mục tiêu sai):

  • Ruby không cho phép gọi super.method2 trong bối cảnh method1 gọi trong một thể hiện của B, becau nó chỉ là sai để làm điều đó. Thừa kế lớp nên được sử dụng khi các cá thể của bạn là các chuyên môn của lớp cha. Điều đó bao gồm rằng bạn thường chỉ mở rộng hành vi, bằng cách gọi điện thoại siêu và làm một cái gì đó bổ sung trước hoặc sau cuộc gọi đó.
  • Có những ngôn ngữ như Java và các ngôn ngữ khác, cho phép gọi siêu cho một phương thức khác và dẫn đến một cái gì đó tương tự như mã spaghetti, nhưng theo cách hướng đối tượng. Không ai hiểu khi nào phương pháp được gọi, vì vậy hãy cố gắng tránh nó.

Vì vậy, hãy thử tìm lý do bạn muốn thay đổi cuộc gọi và khắc phục điều đó. Nếu method1 trong A của bạn được triển khai sai trong B, thì bạn không nên là lớp con.

+0

"Ngay cả khi suy nghĩ câu trả lời của @ sepp2k là chính xác" Có lý do gì để nghĩ rằng nó không phải là? – sepp2k

+0

Xin lỗi, tôi muốn thể hiện rằng câu trả lời của bạn là chính xác về mặt kỹ thuật, nhưng câu hỏi tự nó có những thiếu sót. Tôi sẽ sửa nó, xin lỗi vì sự hiểu lầm đó. – mliebelt

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