2010-12-17 9 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

私の例は、私が確認したいと仮定しています。たとえば、多型は継承が使用される場所に限定されます。ダックタイピングはミックスインを示しています。私はこれをクリアするのに問題があります、書籍/ウィキペディアなどの情報が矛盾しているようです。 – Question

答えて

0

は、誰かが下記の私の例で説明していただけます変数はノイズを発生させる可能性があります)が、CatsとBirdsがノイズを生成できるという事実は、多形性として知られているサブクラス化メカニズムの理論的記述です。

多型とダックタイピングの違いは、多形性はどんな状況においても別のタイプの代わりに特定のタイプであると主張するオブジェクトを使用できるというアイデアですが、アヒルタイピングはアイデアです特定のインタフェースを実装している限り、オブジェクトの型は気にしません。 例えば、Javaの場合、Animalのサブクラスを作成すると、ノイズを生成するだけでなく、動物に関連するその他の動作を期待することができますが、Rubyの場合、オブジェクトがノイズを生成できるという事実特定のメソッドの存在だけで、型に依存しません。 もちろん、Javaでは、同じパターンに対して(静的な)メカニズムを与えるインターフェースという概念があります。

最も重要な違いIMHOは、概念そのものではなく、名前の背後にある異なるプログラミング哲学です。

私は、ポリモフィズムという言葉はより構造化されたOOPアイデアと関連していると思いますが、Rubyはさまざまな可能性と意味を持つプログラミング方法の名前を作り上げなければなりませんでした。

+0

あなたの素早い返答をありがとう。ですから、多型は遺伝が関与する場所に限られていると言っていますか?これは、継承が関係しているときに、ダックタイピングが多型と同じであることを意味しますか? – Question

+0

多型の定義は継承に依存するとは考えていませんが、それ自体はまったく普遍的なものではないと私は考えています。これはウィキペディアのエントリーにあります:強く型付けされた言語では多型は通常A型は何らかの形でB型、型Cは、型Bを表すインタフェースを実装します。弱型型言語では、型は暗黙的に多型です。 –

+0

「多態性(非常に単純に言えば)は、基底クラスが期待される派生クラスを使用する可能性がある」という下のリンクで定義されています。 Rubyのような動的型付き言語では、「予想される」クラスが存在しないので、この推論では多態性はRubyには適用されません。私はダックタイピングと多型性を区別するでしょうか? http://stackoverflow.com/questions/3343625/why-does-wikipedia-say-polymorphism-is-not-the-same-as-method-overloading-or-met – Question

関連する問題