ruby - 如何在 ruby​​ 中使基类方法不可重写?

标签 ruby oop overriding

我有一些基类 A 有一个不能被覆盖的方法。

class A
  def dont_override_me
    puts 'class A saying, "Thank you for not overriding me!"'
  end
end

还有另一个扩展 A 并尝试重写 dont_override_me 方法的 B 类。

class B < A
  def dont_override_me
    puts 'class B saying, "This is my implementation!"'        
  end
end

如果我实例化 B 并调用 dont_override_me,类 B 的实例方法将被调用。

b = B.new
b.dont_override_me # => class B saying, "This is my implementation!"

这是因为 ruby 的特性。可以理解。

但是,如何强制基类方法 dont_override_me 不能被它的派生类覆盖?我在 ruby​​ 的 java 中找不到像 final 这样的关键字。在 C++ 中,可以将基类方法设为非虚方法,以便派生类无法覆盖它们。我如何在 ruby​​ 中实现这一点?

最佳答案

你可以通过 Hook change 事件并将其改回来做到这一点,但对我来说它似乎有点臭:

http://scie.nti.st/2008/9/17/making-methods-immutable-in-ruby

这是定义 Ruby 的那些东西之一,所以反对它似乎有点毫无意义。如果有人重新定义了一些东西,以至于它可怕地崩溃了..那是他们的问题;-)

关于ruby - 如何在 ruby​​ 中使基类方法不可重写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/708642/

相关文章:

ruby - 如何在 ruby​​ 中显示 ascii 艺术字符串?

javascript - 函数的所有实例是否可以访问同一个私有(private)变量?

c# - 将父类(super class)传递给 C# 函数(带有 Java 序曲)

oop - 在 MATLAB 中覆盖父类(super class)方法和访问修饰符

ruby-on-rails - 使用 ruby​​ on Rails 仅从 github api 中提取 Unresolved 问题,而不进行任何 pull 请求

ruby-on-rails - 对 Devise Controller 进行子类化后,Rails View 中的实例变量为零

javascript - javascript call() 和 apply() 通过实现的区别

java - 为什么不能在编译时覆盖而重载可以?

c# - 如何改进 C# 中方法重载的枚举标识结构

ruby - Ruby 数组是什么数据结构?