class A def a puts 'in #a' end end class B < A def a b() end def b # here i want to call A#a. end end
Trả lời
class B < A
alias :super_a :a
def a
b()
end
def b
super_a()
end
end
Không có cách nào tốt đẹp để làm điều đó, nhưng bạn có thể làm A.instance_method(:a).bind(self).call
, hoạt động nhưng rất xấu.
Bạn thậm chí có thể xác định phương pháp riêng của mình trong Object để hành động như siêu trong java:
class SuperProxy
def initialize(obj)
@obj = obj
end
def method_missing(meth, *args, &blk)
@obj.class.superclass.instance_method(meth).bind(@obj).call(*args, &blk)
end
end
class Object
private
def sup
SuperProxy.new(self)
end
end
class A
def a
puts "In A#a"
end
end
class B<A
def a
end
def b
sup.a
end
end
B.new.b # Prints in A#a
@klochner Tôi không đồng ý, giải pháp này chính xác là những gì tôi cần ... lý do: Tôi muốn gọi chung một phương pháp khác, nhưng không cần phải bí danh mọi phương pháp mà tôi muốn có thể để làm điều này, vì vậy một cách chung chung để gọi siêu là khá hữu ích –
Phức tạp để xác định một lần, đơn giản để gọi nó rất nhiều lần. Đó là tốt hơn so với ngược lại. – nertzy
Nếu bạn không rõ ràng cần phải gọi A # một từ B # b, mà đúng hơn là cần để gọi A # a từ B # a, đó là hiệu quả những gì bạn đang làm theo cách B # b (trừ khi bạn là ví dụ không đủ hoàn chỉnh để chứng minh lý do bạn gọi từ B # b, bạn có thể Tôi biết điều này là hiển nhiên, tôi chỉ muốn làm rõ cho bất kỳ người mới sử dụng Ruby nào mà bạn không cần phải bí danh (cụ thể điều này đôi khi được gọi là một "bí danh xung quanh") trong mọi cas e.
class A
def a
# do stuff for A
end
end
class B < A
def a
# do some stuff specific to B
super
# or use super() if you don't want super to pass on any args that method a might have had
# super/super() can also be called first
# it should be noted that some design patterns call for avoiding this construct
# as it creates a tight coupling between the classes. If you control both
# classes, it's not as big a deal, but if the superclass is outside your control
# it could change, w/o you knowing. This is pretty much composition vs inheritance
end
end
- 1. Gọi phương thức siêu siêu gọi
- 2. Ruby mixins và gọi siêu phương pháp
- 3. Phương thức gọi bên trong phương thức khác trong javascript?
- 4. Phân cấp gọi phương thức Ruby
- 5. Phương thức gọi trong lớp cha từ các phương thức lớp con trong Ruby
- 6. Gọi phương thức ghi đè, siêu lớp cuộc gọi đã ghi đè phương thức
- 7. Cuộc gọi phương thức ghi đè trong Ruby?
- 8. Gọi một phương pháp siêu trong PHP
- 9. Gọi một phương thức phân lớp từ siêu lớp
- 10. Siêu lớp có không gọi phương thức ghi đè không?
- 11. Có sự khác biệt nào giữa :: và. khi gọi các phương thức lớp trong Ruby?
- 12. Gọi phương thức cá thể riêng từ phương thức lớp trong Ruby
- 13. Làm cách nào để gọi phương thức siêu đẳng
- 14. Gọi phương thức từ phương thức khác trong cùng một lớp trong C++
- 15. Cách gọi phương thức siêu đối tượng Oracle PL/SQL
- 16. Ruby: có một từ khóa để gọi một phương thức từ bên trong chính nó (tương tự như siêu)?
- 17. Gọi phương pháp siêu coffescript
- 18. util.inherits - cách gọi phương thức siêu ví dụ?
- 19. Gọi phương thức trên siêu lớp trong đặc điểm tự đánh máy trong scala
- 20. Từ khoá "siêu" trong phương thức lớp học
- 21. Gọi siêu phương pháp lớp tự động
- 22. Phương thức Ruby trong Javascript trong HAML
- 23. Máy so sánh <String> phải ghi đè lên phương thức siêu hạng
- 24. gọi phương thức javascript trong tệp .js khác
- 25. Siêu từ khóa trong Ruby
- 26. Làm thế nào để gọi phương thức của siêu lớp trong một phương thức lớp gen Clojure?
- 27. Phương thức gọi từ một ViewController khác
- 28. Gọi phương thức riêng xxx bằng self.xxx() từ bên trong phương thức riêng khác dẫn đến lỗi "phương thức riêng` xxx 'được gọi là "
- 29. Phương thức nhà máy trong Ruby
- 30. gọi phương thức từ phương thức khác trong cùng lớp PHP
Để đặt bí danh một phương thức lớp, hãy xem http://stackoverflow.com/questions/2925016/alias-method-and-class-methods-dont-mix –
Có thể là 'bí danh' đã được đổi tên thành [' alias_method'] (http://apidock.com/ruby/Module/alias_method) vì câu trả lời này đã được viết? –
@JaredBeck nó thực sự đã được đổi tên. Vì vậy, bây giờ nó phải là: alias_method: super_a: a –