在Ruby中阻止静态函数的继承

时间:2013-12-04 09:13:46

标签: ruby oop inheritance

一个小测试用例:

class A
  def self.print
    puts "Hello A"
  end
end


class B < A
end

A.print
B.print

输出:

Hello A
Hello A

我想阻止print中定义的class A函数的继承。有可能吗?

想要输出:

Hello A
`<main>': undefined method `print' for B:Class (NoMethodError)

我找到了private_class_method,但由于A.print来电失败,我所寻找的并不是特别的。

2 个答案:

答案 0 :(得分:5)

class A
  def self.print
    puts "Hello A"
  end

  def self.inherited(klass)
    class << klass
      undef :print
    end
  end
end

class B < A
end

A.print
# Hello A

B.print
# private method `print' called for B:Class (NoMethodError)

答案 1 :(得分:3)

class B < A
  class << self
    undef print
  end
end

class << self块中声明方法与声明前缀为self.的方法相同。 它还允许您想要的行为。