1

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
4

1 に答える 1

0

あなたの例では、ダックタイピングのおかげで各ループが機能していると言えます(クライアントコードは変数がノイズを発生できるかどうかのみを気にするという事実に関連しています)が、猫と鳥がノイズを発生できるという事実は理論的な説明ですポリモーフィズムとして知られるサブクラス化メカニズムの。

したがって、ポリモーフィズムとダック タイピングの違いは、ポリモーフィズムとは、特定のタイプであると主張するオブジェクトを、どのような状況でも別のタイプの代わりに使用できるという考えであると言えますが、ダック タイピングは、そうではないという考えです。特定のインターフェースを実装している限り、オブジェクトのタイプに注意してください。たとえば Java で Animal のサブクラスを作成すると、音を出すだけでなく、動物に関連する他の動作も期待できますが、Ruby の場合、オブジェクトが音を出すことができるという事実はありません。タイプに依存するのではなく、特定のメソッドの存在にのみ依存します。もちろん Java では、同じパターンの (静的) メカニズムを提供するインターフェースの概念があります。

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

それはすべて、ポリモーフィズムという用語がより構造化された OOP のアイデアに関連付けられているのに対し、Ruby はさまざまな可能性と意味を持つプログラミング方法の名前を発明しなければならなかったという事実に帰着すると思います。

于 2010-12-17T16:07:17.690 に答える