Ruby - 如何处理子类意外覆盖超类私有字段的问题?

Cla*_*diu 5 ruby oop subclass subclassing

假设你写了一个类Sup,我决定将它扩展为Sub< Sup.我不仅需要了解您发布的界面,还需要了解您的私人领域.见证这个失败:

class Sup

  def initialize
    @privateField = "from sup"
  end

  def getX
    return @privateField
  end
end

class Sub < Sup

  def initialize
    super()
    @privateField = "i really hope Sup does not use this field"
  end
end

obj = Sub.new
print obj.getX #  prints "i really hope Sup does not use this field"
Run Code Online (Sandbox Code Playgroud)

问题是,解决这个问题的正确方法是什么?似乎子类应该能够使用它想要的任何字段而不会弄乱超类.

编辑:Java中等效示例返回"from Sup",这也是应该产生的答案.

hoh*_*oha 9

实例变量与继承无关,它们是在第一次使用时创建的,而不是通过某种定义机制创建的,因此在语言中没有对它们进行特殊的访问控制,并且它们不能被遮蔽.

我不仅需要了解您发布的界面,还需要了解您的私人领域.

实际上这是一个"官方"的立场.摘自"Ruby编程语言"一书(Matz是其中一位作者):

...这是另一个原因,当你熟悉(并控制)超类的实现时,扩展Ruby类是安全的.

如果你不知道它内外都是你自己.伤心但真实.