2010-12-17 72 views
1

Ruby支持「包含多態性」嗎?這與鴨打字相同嗎?Ruby支持包含多態性嗎

如果不是,多態性和Ruby中的鴨子打字有什麼區別?

可有人請與下面我舉個例子說明:

# superclass - inheritance 
class Animal 
    def make_noise 
    # define abstarct method (force override) 
    raise NoMethodError, "default make_noise method called" 
    end 
end 

# module - composition 
module Fur 
    def keep_warm 
    # etc 
    end 
end 

# subclass = is-a relationship 
class Bird < Animal 
    # override method - polymorphism 
    def make_noise 
    "Kaaw" 
    end 
end 

class Cat < Animal 
    # module mixin = has-a relationship 
    include Fur 

    def make_noise 
    "Meow" 
    end 
end 

class Radio 
    # duck typing (no inheritance involved) 
    def make_noise 
    "This is the news" 
    end 
end 

class Coat 
    include Fur 
end 

animals = [Bird,Cat,Radio,Coat,Animal] 

animals.each do |a| 
    # polymorphism or duck typing? 
    obj = a.new 
    if obj.respond_to? 'make_noise' 
    puts obj.make_noise 
    end 
end 
+0

我的例子做出了我想確認的假設。例如,多態性僅限於使用繼承的地方。鴨子打字說明mixin。我在解決這個問題時遇到了麻煩,似乎存在來自書籍/ wikipedia等的衝突信息。 – Question 2010-12-17 16:03:48

回答

0

那麼在你的榜樣,你可以說,每一個循環工程由於鴨打字(相關事實,客戶端代碼只關心如果變量可以產生噪音),但貓和鳥可以產生噪音這一事實是對稱爲多態性的亞類機制的理論描述。

所以你可以說多態性和鴨子打字的區別在於,多態是一種想法,你可以在任何情況下使用聲稱是某種類型的對象來代替另一種類型,但是鴨子打字就是你不關心對象的類型,只要它實現了某個接口。 因此,例如在Java中,如果您創建動物的一個子類,那麼您不僅可以期望它產生噪音,還可以讓其他行爲與動物相關聯,而在Ruby的情況下,物體可以產生噪音不依賴於類型,而僅僅依賴於特定方法的存在。 當然,在Java中你有接口的概念,它給出了相同模式的(靜態)機制。

最重要的區別恕我直言,不同的編程哲學背後的名稱,而不是在概念本身。

我想這一切都歸結爲一個事實,polymorfism與更多結構化的面向對象的想法相關聯,而Ruby不得不爲一種具有不同可能性和含義的編程方式創建一個名稱。

+0

感謝您的快速回復。所以你說多態只限於繼承涉及的地方?這是否意味着,在涉及繼承時,鴨子打字是否與多態相同? – Question 2010-12-17 16:38:32

+0

我不認爲多態性的定義取決於繼承,我也不認爲它本身就是非常普遍的,這是在維基百科條目上:在強類型語言中,多態性通常意味着類型A以某種方式從B類派生,或者類型C實現了一個表示類型B的接口。在弱類型語言中,類型是隱式多態的。 – 2010-12-17 17:41:05

+0

我在下面的鏈接中找到了一個定義,其中指出「多態性(非常簡單地說)是使用派生類的可能性,其中基類是預期的」。在像Ruby這樣的動態類型語言中沒有「預期」類,所以通過這種推理,多態不適用於Ruby?例如,我將如何區分duck-typing和多態? http://stackoverflow.com/questions/3343625/why-does-wikipedia-say-polymorphism-is-not-the-same-as-method-overloading-or-met – Question 2010-12-17 17:52:42