You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby子类调用父类静态方法时super报错:无对应父类方法

问题原因

你遇到的错误是因为在子类Adherent的类方法creer_adherent中使用super时,Ruby会尝试调用父类Personne中同名的类方法,但父类Personne根本没有定义self.creer_adherent方法,只有self.create方法,所以会抛出找不到方法的错误。

解决方案

你真正需要的是调用父类的create方法,而不是用super去寻找同名方法,直接修改子类的creer_adherent方法即可:

class Adherent < Personne
  # ... 其他代码
  def self.creer_adherent
    Personne.create("adhérent")
  end
end

或者,如果你想避免硬编码父类名称,也可以通过self.superclass来调用:

def self.creer_adherent
  self.superclass.create("adhérent")
end
额外优化建议

父类Personne的create方法里硬编码了Adherent和Auteur,这会导致后续新增子类时需要修改这个方法,不够灵活。可以改成通过常量动态查找的方式:

class Personne
  # ... 其他代码
  def self.create(type)
    print "Nom:"
    nom = gets.chomp
    print "Prénom:"
    prenom = gets.chomp
    # 动态获取对应的子类常量
    classe = Object.const_get(type.capitalize)
    personne = classe.new(nom, prenom)
    @@liste.push(personne)
    puts "#{type.capitalize} créé(e) : #{personne.nom} #{personne.prenom}"
  end
end

这样不管新增多少个子类,只要传入对应的type字符串(首字母大写对应类名),就能自动创建对应实例,不需要修改create方法。

内容的提问来源于stack exchange,提问作者user19297279

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 00:12:51