2011-10-07 7 views
12

私はRubyを使って遊んでいて、OOのテクニックと継承について学んでいます。しばらく私を逃したエラーを私はついに犯しました。Ruby継承 - スーパー引数の数を正しく初期化しない

人クラス

class Person 
    attr_accessor :fname, :lname, :age 

    def has_hat? 
     @hat 
    end 

    def has_hat=(x) 
     @hat = x 
    end 

    def initialize(fname, lname, age, hat) 
     @fname = fname 
     @lname = lname 
     @age = age 
     @hat = hat 
    end 

    def to_s 
     hat_indicator = @hat ? "does" : "doesn't" 
     @fname + " " + @lname + " is " + @age.to_s + " year(s) old and " + hat_indicator + " have a hat\n" 
    end 

    def self.find_hatted() 
     found = [] 
     ObjectSpace.each_object(Person) { |p| 
      person = p if p.hat? 
      if person != nil 
       found.push(person)    
      end 
     } 
     found 
    end 

end 

プログラマークラス(人から継承)

require 'person.rb' 

class Programmer < Person 
    attr_accessor :known_langs, :wpm 

    def initialize(fname, lname, age, has_hat, wpm) 
     super.initialize(fname, lname, age, has_hat) 
     @wpm = wpm 
     @known_langs = [] 
    end 

    def is_good? 
     @is_good 
    end 

    def is_good=(x) 
     @is_good = x 
    end 

    def addLang(x) 
     @known_langs.push(x) 
    end 


    def to_s 
     string = super.to_s 
     string += "and is a " + @is_good ? "" : "not" + " a good programmer\n" 
     string += " Known Languages: " + @known_languages.to_s + "\n" 
     string += " WPM: " + @wpm.to_s + "\n\n" 
     string 
    end 

end 

その後、私のメインのスクリプトでは、この行にこれにより

... 
programmer = Programmer.new('Frank', 'Montero', 46, false, 20) 
... 

を失敗していますエラー

./programmer.rb:7:in `initialize': wrong number of arguments (5 for 4) (ArgumentError) 
     from ./programmer.rb:7:in `initialize' 
     from ruby.rb:6:in `new' 
     from ruby.rb:6:in `main' 
     from ruby.rb:20 

答えて

23

super.initializeを呼び出す代わりに、必要なparamsを呼び出す。あるべき

super(fname, lname, age, has_hat) 
+9

特別な注意事項:私の親クラスには、引数を取っていない、その子は1を取りました。なぜスーパークラスが*引数なし*を明示的に呼び出す 'super()'を使うべきか分かったとき、私は子供の 'super'が' initialize'から 'Parent.initialize'への引数を渡す理由を疑問に思っていました。 – Droogans

+0

@Doogans:thx!明示的なかっこを持つsuper()はsuperとは異なります。 – JCLL

2

プログラマーが初期化 -

def initialize(fname, lname, age, has_hat, wpm) 
    super(fname, lname, age, has_hat) 
    @wpm = wpm 
    @known_langs = [] 
end 
+1

ええ、それは@Narenが言ったことです... – jondavidjohn

関連する問題