ruby - 在 Ruby 中防止继承

标签 ruby inheritance

我想弄清楚如何防止在所有子类中继承一个方法。目前我正在尝试使用这样的代码:

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/

相关文章:

arrays - 如何返回指示 Ruby 中数组的最大到最小整数位置的索引

ruby - 用于在 Aptana Studio 3 中评论 ruby​​ 代码的热键不适用于德语键盘

c++ - 复制对象——保持多态性

python类属性继承

Java 继承或 GUI 出了问题

ruby - (REDDIT) 尝试通过 API 订阅 subreddits 时出错

mysql - 扩展 ruby​​、activerecord、mysql 应用程序

ruby - ruby 中两次提交之间新行的代码覆盖率

java - 覆盖使用子类型的方法

Java 实例化接口(interface)会导致奇怪的行为