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
相关产品推荐
相关产品推荐

