2009-08-09 33 views
47
 
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

79
class B < A 

    alias :super_a :a 

    def a 
    b() 
    end 
    def b 
    super_a() 
    end 
end 
+0

Để đặ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 –

+0

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

+0

@JaredBeck nó thực sự đã được đổi tên. Vì vậy, bây giờ nó phải là: alias_method: super_a: a –

29

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 
+8

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

+3

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

0

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 
Các vấn đề liên quan