2013-03-02 107 views
1

我只是在扮演看到從子類的實例方法調用父類的實例方法調用和使用我的測試的代碼如下:混亂與子類

class Animal 
    def bark 
    p "hukkhh" 
    end 
end 
#=> nil 

class Cow < Animal 
end 
#=> nil 

Cow.public_instance_method(:bark) 
#=> #<UnboundMethod: Cow(Animal)#bark> 

class Cow 
    bark 
end 
#=> NameError: undefined local variable or method `bark' for Cow:Class 
#  from (irb):11:in `<class:Cow>' 
#  from (irb):10 
#  from C:/Ruby193/bin/irb:12:in `<main>' 

從那個代碼,我證實了實例方法不能在沒有相應類的對象實例的情況下執行。

但後來我嘗試下面的代碼:

def talk 
    p "hi" 
end 
#=> nil 

Object.public_instance_method(:talk) 
#=> #<UnboundMethod: Object#talk> 

class Foo 
    talk 
end 
# prints: hi 
#=> "hi" 

這裏輸出使我困惑我的第一個測試代碼輸出。

誰能幫我瞭解這些背後以上的事實呢? talk你定義是

回答

2

方法屬於Object這是所有對象的根。所以talk方法可用於紅寶石中的所有對象。

def talk 
    p "hi" 
end 

Object.respond_to? :talk #=> true 

現在,您定義了類別Foo,它也是一個紅寶石對象。

Foo.is_a? Object #=> true 
Foo.respond_to? :talk #=> ture 

因此talk可用於Foo類。

現在你定義一個類Animal與方法bark

class Animal 
    def bark 
    p "hukkhh" 
    end 
end 

bark方法定義是屬於Animal類現在作爲instance level方法不是一流水平。這意味着你需要創建Animal類的實例調用bark

Animal.respond_to? :bark #=> false 
Object.respond_to? :bark #=> false 

Animal.new.respond_to? :bark #=> true 
Animal.respond_to? :talk #=> true #talk is available to Animal also because Animal is also object of Class 
Animal.new.respond_to? :talk #=> true 

現在你創建類名爲CowAnimal繼承。所以bark是提供給Cow除非是overridden

class Cow < Animal 
end 

Cow.respond_to? :bark #=> false 
Cow.new.respond_to? :bark #=> true 
Cow.respond_to? :talk #=> true 
Cow.new.respond_to? :talk #=> true 

Cow.new.bark #=> "hukkhh" 

所以致電bark您需要創建類的實例。

如果你想調用它在孩子父母覆蓋的方法,使用super

class Cow < Animal 
    def bark 
    super 
    #do your stuff 
    end 
end 

Cow.new.bark #=> "hukkhh" 
+0

我希望你比我更好的解釋器:-) – mdesantis 2013-03-02 18:27:22

+0

爲什麼沒有'Cow.respond_to? :talk#=> true'和'Cow.new.respond_to? :說話#=>真實'給予真實。我的意思是'talk'是一種類方法嗎?那麼爲什麼'Cow.new.respond_to? :talk#=> true'? – 2013-03-02 18:47:55

+0

'talk'是Object'的'方法這是所有對象的根和'class'也是'Object'。你可以檢查這個:'class.is_a? Object'。它應該返回'true'。你可以閱讀更多關於'Object'這裏:http://ruby-doc.org/core-2.0/Object.html – codeit 2013-03-02 19:01:46