2011-10-07 24 views
12

Tôi đang chơi với Ruby và tìm hiểu về kỹ thuật và thừa kế của OO và cuối cùng tôi đã gặp phải lỗi đã lẩn tránh tôi một thời gian.Thừa kế Ruby - Siêu khởi tạo nhận sai số đối số

Person Lớp

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 

Programmer Class (được thừa hưởng từ Person)

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 

Sau đó, trong kịch bản chính của tôi Đó là thất bại trên đường dây

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

này Với điều này lỗi

./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 

Trả lời

23

gọi siêu với tham số bắt buộc thay vì gọi super.initialize.

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

Thông báo đặc biệt: lớp cha mẹ tôi mất không có đối số, con của nó mất một. Tôi cứ tự hỏi tại sao 'super' của đứa trẻ lại đi vào đối số của nó từ' initialize' thành 'Parent.initialize', khi tôi nhận ra rằng mình nên sử dụng' super() ', gọi rõ ràng class cha với * no arguments *. – Droogans

+0

@Doogans: thx! super() với dấu ngoặc đơn rõ ràng khác với siêu. – JCLL

2

Programmer khởi tạo nên -

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

vâng ... đó là những gì @Naren đã nói ... – jondavidjohn

Các vấn đề liên quan