我想弄清楚如何防止在所有子类中继承一个方法。目前我正在尝试使用这样的代码:
class Mother
def phone
puts "#{self.class} phoned"
end
protected
def phone_kids
puts "phoned kids"
end
end
class Kid < Mother
end
但没有任何结果,因为我收到这样的错误:<top (required)>': protected method 'phone_kids' called for #<Mother:0x604da0> (NoMethodError)
.能否请您简要解释一下 Ruby 中的继承是如何工作的?
提前致谢!
//编辑:
我在使用这段代码时遇到了这个错误:
kid = Kid.new
mom = Mother.new
mom.phone_kids
最佳答案
如果您发现自己需要这样做,可能意味着您没有正确使用继承。如果类 C 继承自 D,它应该是一个"is"关系:每个 C 都是一个 D .由于并非每个 child 都是母亲,因此您在这种情况下使用继承是不好的。
以下是您如何在 Ruby 中仅使用一个类来表示 parent 和 child :
class Person
attr_accessor :name
attr_accessor :children
def initialize(name)
@name = name
@children = []
end
def phone_kids
@children.each { |c| c.phone }
end
def phone
puts "#{@name} phoned"
end
end
现在,回答最初的问题。如果你想阻止 Kid
类继承 phone_kids
方法,你可以这样做:
class Mother
def self.inherited(klass)
klass.send(:define_method, :phone_kids) do
raise NoMethodError
end
end
def phone_kids
puts "phoned kids"
end
end
class Kid < Mother
end
Mother.new.phone_kids # => phoned kids
Kid.new.phone_kids # => NoMethodError
关于ruby - 在 Ruby 中防止继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23344466/