父类能否调用子类私有方法?Ruby访问控制实例疑问
Ruby中父类调用子类私有方法的原因解析
首先得纠正一个对Ruby私有方法的常见误解:Ruby的私有方法限制不是“只能在定义它的类或子类内部调用”,而是绝对不能通过显式的接收者(包括self)来调用。只要调用时没有指定接收者,Ruby就会基于当前运行时的self(也就是实际的对象实例)去查找方法。
结合你的代码来看:
- 当创建
RoadBike.new时,初始化流程会执行父类Bicycle的initialize方法,此时方法内部的self是RoadBike的实例(而非Bicycle实例)。 - 调用
default_chain时没有写接收者(比如没写self.default_chain),Ruby会沿着当前self的方法查找链去搜索:先找RoadBike类的方法,刚好找到子类里定义的私有default_chain。 - 因为这次调用是隐式的(没有指定接收者),完全符合Ruby私有方法的调用规则,所以不会触发访问控制报错。
反过来验证:如果把父类initialize里的default_chain改成self.default_chain,代码立刻会报错——因为显式指定了接收者self,违反了私有方法不能有显式接收者的规则。
总结来说,核心是Ruby的私有方法限制针对的是调用方式(是否有显式接收者),而非代码所在的类。只要调用时没有显式接收者,运行时的self是哪个类的实例,就会从哪个类开始查找方法,哪怕调用代码写在父类里也没问题。
内容的提问来源于stack exchange,提问作者Greg
相关产品推荐
相关产品推荐

