是否可以在重写方法中执行super.super
之类的操作?也就是说,绕过直接父母的超级并称为“祖父母”超级?
答案 0 :(得分:21)
不推荐这样做,但你想要的 可能是这样的:
grandparent = self.class.superclass.superclass
meth = grandparent.instance_method(:the_method)
meth.bind(self).call
首先获取祖父母类,然后在其上调用instance_method
以获得代表祖父母版本UnboundMethod
的{{1}}。然后使用the_method
和UnboundMethod#bind
在当前对象上调用祖父母的方法。
答案 1 :(得分:0)
你可以修改方法的参数以允许某种可选的'传递给父'参数。在您孩子的超类中,检查此参数,如果是,请从该方法调用super并返回,否则允许继续执行。
class Grandparent; def method_name(opts={}); puts "Grandparent called."; end; end
class Parent < Grandparent
def method_name(opts={})
return super if opts[:grandparent]
# do stuff otherwise...
puts "Parent called."
end
end
class Child < Parent
def method_name(opts={})
super(:grandparent=>true)
end
end
ruby-1.9.2-p0 > Child.new.method_name
Grandparent called.
=> nil
否则我同意@Femaref,只是b / c有可能并不意味着它是个好主意。如果您认为有必要,请重新考虑您的设计。
答案 2 :(得分:-1)
考虑到这违反了OOP(封装)的原则之一,我非常希望这是不可能的。即使您尝试这样做也会说明您的设计存在问题。