ruby 从子类方法内部调用静态超类方法

brvekthn  于 2023-03-22  发布在  Ruby
关注(0)|答案(2)|浏览(148)

嗨,我是Ruby新手,我不明白为什么对超类的静态方法的调用不能使用super关键字,我得到了这种错误

super: no superclass method `creer_adherent' for Adherent:Class

这就是超类:

class Personne
      ...
   def self.create(type)
        print "Nom:"
        nom = gets.chomp
        print "Prénom:"
        prenom = gets.chomp
        if type == "adhérent"
            personne = Adherent.new(nom,prenom)
        else
            personne = Auteur.new(nom,prenom)
        end
        @@liste.push(personne)
        puts "#{type.capitalize} créé(e) : #{personne.nom} #{personne.prenom}"
    end
   end

然后是子类:

class Adherent < Personne
      ...
    def self.creer_adherent
       super.create("adhérent")
    end
   end

main.rb

loop do
    case menu
    when "0"
      break
    when "1"
      Adherent.creer_adherent
    end 
end
vcudknz3

vcudknz31#

当我把调用改为这个时,它起作用了:

def self.creer_adherent
    method(:create).call("adhérent")
  end

现在的问题是我有完全相同的类(Livre)和它的超类(Document),但是当我使用与上面问题中完全相同的代码(super.create)时,它没有给予我一个错误,并且工作得很好!

pengsaosao

pengsaosao2#

你误解了Ruby中super关键字的作用和它的实际用途。super用于调用超类中同名的方法:

class Adherent < Personne
  def self.create
    super("adhérent")
  end
end

它不是对超类的引用。因此,当你调用super时,你是在超类上调用creer_adherent-然后你试图在它的返回值上调用.create
如果你只想调用一个继承的方法,你只需调用它:

class Adherent < Personne
  def self.creer_adherent
    create("adhérent")
  end
end

如果你真的想显式地调用超类上的方法,你可以:

class Adherent < Personne
  def self.create
    puts "This method should not be called"
  end

  def self.creer_adherent
    superclass.create("adhérent")
  end
end

但这不是你通常会做的事情。

相关问题