1

Ruby 是否支持“包含多态性”?这和 Duck Typing 一样吗?

如果不是,那么 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

好吧,在您的示例中,您可以说每个循环的工作要归功于鸭子类型(与客户端代码只关心变量是否会产生噪音的事实有关),但是 Cats and Birds 会产生噪音的事实是理论上的描述称为多态性的子类化机制。

因此,您可以说多态性和鸭子类型之间的区别在于,多态性是指您可以在任何情况下使用声称是某种类型的对象来代替另一种类型的想法,但鸭子类型是您不使用的想法关心对象的类型,只要它实现了一定的接口。因此,例如在 Java 中,如果您创建 Animal 的子类,您可以期望它不仅会产生噪音,而且还会产生与动物相关的其他行为,而在 Ruby 中,对象可以产生噪音的事实并不'不依赖于类型,只依赖于特定方法的存在。当然,在 Java 中,您有接口的概念,它为相同的模式提供(静态)机制。

恕我直言,最重要的区别是名称背后的不同编程哲学,而不是概念本身。

我想这一切都归结为这样一个事实,即多态性一词与更结构化的 OOP 思想相关联,而 Ruby 必须为一种具有不同可能性和含义的编程方式发明一个名称。

于 2010-12-17T16:07:17.690 回答