【发布时间】:2011-03-18 13:52:21
【问题描述】:
假设你写了一个类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"
问题是,解决这个问题的正确方法是什么?似乎子类应该能够使用它想要的任何字段而不会弄乱超类。
编辑:equivalent example in Java 返回"from Sup",这也是应该产生的答案。
【问题讨论】:
-
在这种情况下,您希望
.getX返回什么?你在调用 super 之后覆盖了这个字段,所以输出应该是你得到的那个。 -
@Dogbert:看看this example in Java。 “from Sup”是正确答案
-
如果使用 privateField 而不是 @privateField,您将得到“来自 sup”的结果。
-
@krunal shah:似乎不起作用..你能发布一个答案并更明确吗?
-
您也可以使用 __privateField 将其转换为 Python。 Python 将每个类中的 __privateField 重命名为 __Sub_privateField 和 __Sup_privateField。我不确定 Ruby 中是否有类似物。
标签: ruby oop subclass subclassing