Ruby中如何从子类访问父类方法 正确调用语法
核心问题说明
你当前的写法有3个本质错误,导致无法正常调用:
- 类嵌套不等于继承:Ruby中写在
class Parent内部的class Child只是Parent命名空间下的独立类,默认继承Object,和Parent没有继承关系,自然无法直接调用Parent的实例方法。Ruby的继承必须显式使用<符号声明。 - 方法类型不匹配:你定义的
p_do_something_1是Parent的实例方法,必须通过Parent类的实例对象才能调用,直接写Parent.p_do_something_1()是类方法调用语法,找不到对应方法。 - 调用位置错误:你把调用逻辑直接写在了Child的类定义顶层(不在任何实例方法内部),这段代码会在类加载时直接执行,当前上下文是Child类对象本身,根本不具备调用父类实例方法的环境,而且你写的
p_do_something_1 = xxx只是定义了一个类加载时生效的局部变量,不是类的方法成员。
正确实现方案
根据你的实际需求选对应写法即可:
场景1:Child作为Parent的子类(最常用的继承场景)
如果你的目的是让Child继承Parent的特性,复用Parent的方法,不要把Child嵌套在Parent内部,显式声明继承关系即可。子类的实例方法内可以直接调用父类的public/protected实例方法,重写同名方法时可以用super显式调用父类原方法。
class Parent def initialize puts "父类初始化逻辑执行" end def p_do_something_1 puts "父类p_do_something_1方法执行" end def p_do_something_2 puts "父类p_do_something_2方法执行" end end # 用 < 显式声明继承关系 class Child < Parent def initialize super # 调用父类同名initialize方法,不传参数时super后面的括号可以省略 puts "子类初始化逻辑执行" end def c_do_something_1 puts "子类c_do_something_1方法执行" # 直接调用父类public实例方法 p_do_something_1 end end # 测试 child = Child.new child.c_do_something_1
场景2:Child作为Parent命名空间下的嵌套类(无继承关系)
如果你只是想把Child放在Parent的命名空间下做逻辑隔离,不需要继承Parent的特性,那调用Parent的实例方法前必须先创建Parent的实例,且调用逻辑要写在Child的方法内部:
class Parent def p_do_something_1 puts "父类实例方法p_do_something_1执行" end # 类方法要加self.前缀,支持直接通过Parent.方法名调用 def self.p_do_something_2 puts "父类类方法p_do_something_2执行" end class Child def c_do_something_1 # 无继承关系,先实例化Parent再调用实例方法 Parent.new.p_do_something_1 # 类方法可以直接通过类名调用 Parent.p_do_something_2 end end end # 测试,嵌套类用::访问命名空间 child = Parent::Child.new child.c_do_something_1
注意事项
- Ruby中类嵌套仅做命名空间隔离,不会自动生成继承关系,不要把嵌套类和子类概念混淆。
- 区分实例方法和类方法:实例方法属于类的实例对象,必须先实例化才能调用;类方法属于类本身,定义时要加
self.前缀,可以直接通过类名调用。 - 不要把业务逻辑直接写在类定义的顶层,这类代码会在类被加载时立即执行,一般仅用于类宏、元编程场景,普通方法调用要写在实例方法或类方法内部。
内容的提问来源于stack exchange,提问作者Dante
相关产品推荐
相关产品推荐

