2011-10-07 9 views
12

मैं रूबी के साथ खेल रहा हूं और ओओ तकनीकों और विरासत के बारे में सीख रहा हूं और अंततः मुझे एक त्रुटि हुई है जो मुझे थोड़ी देर के लिए दूर कर चुकी है।रूबी विरासत - सुपर तर्कों की गलत संख्या प्राप्त करना आरंभ करें

व्यक्ति कक्षा

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 को कॉल करने के बजाय आवश्यक पैरा के साथ सुपर कॉल करें।

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

एक विशेष सूचना: मेरी माता पिता वर्ग कोई तर्क ले लिया है, अपने बच्चे को एक ले लिया। मैंने सोचा कि क्यों बच्चे का 'सुपर' 'प्रारंभिक' से 'Parent.initialize' तक तर्क में गुजर रहा था, जब मुझे एहसास हुआ कि मुझे 'सुपर()' का उपयोग करना चाहिए, जो स्पष्ट रूप से माता-पिता को * कोई तर्क * के साथ कॉल नहीं करता है। – Droogans

+0

@ डुओगन: thx! सुपर() स्पष्ट संश्लेषण के साथ सुपर से अलग है। – JCLL

2

प्रोग्रामर इनिशियलाइज़ होना चाहिए -

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

हाँ ... यही है @ नरेन ने कहा ... – jondavidjohn

संबंधित मुद्दे