📜  Ruby 中的多态性(1)

📅  最后修改于: 2023-12-03 15:34:45.787000             🧑  作者: Mango

Ruby 中的多态性

多态是面向对象编程中的一个重要概念,它允许不同的对象通过相同的接口进行交互和处理。Ruby是一种动态的、弱类型的面向对象编程语言,因此它天生地支持多态。

类的多态性

在 Ruby 中,不同的类可以继承相同的父类或包含相同的模块,这意味着它们会拥有相同的方法,我们可以使用这些方法来实现多态。

例如,我们有两个类 DogCat,它们都继承了 Animal 父类,并且都实现了 make_sound 方法:

class Animal
  def make_sound
    raise NotImplementedError
  end
end

class Dog < Animal
  def make_sound
    "Woof!"
  end
end

class Cat < Animal
  def make_sound
    "Meow!"
  end
end

现在,我们可以创建一个数组,包含 DogCat 的实例,并逐个调用它们的 make_sound 方法:

animals = [Dog.new, Cat.new]

animals.each do |animal|
  puts animal.make_sound
end

运行以上代码,输出结果为:

Woof!
Meow!

由此可见,不同的类可以通过相同的方法名提供不同的实现,这就是类的多态性。

方法的多态性

方法的多态性指的是,相同的方法名可以接收不同类型的参数,并且根据参数类型的不同,执行不同的操作。

在 Ruby 中,方法的参数可以是任何对象,因此我们可以利用对象的多态性实现方法的多态性。例如:

def area(shape)
  shape.area
end

class Circle
  def initialize(radius)
    @radius = radius
  end

  def area
    Math::PI * (@radius ** 2)
  end
end

class Rectangle
  def initialize(width, height)
    @width = width
    @height = height
  end

  def area
    @width * @height
  end
end

circle = Circle.new(5)
rectangle = Rectangle.new(3, 4)

puts area(circle)      # 输出结果为:78.53981633974483
puts area(rectangle)   # 输出结果为:12

在上面的代码中,我们定义了一个 area 方法,它接收一个 shape 参数。我们还定义了两个类 CircleRectangle,它们都实现了 area 方法。

在调用 area 方法时,我们传入的参数可以是 CircleRectangle 类的实例,因为它们都实现了 area 方法。此时,根据传入的实例不同,area 方法内部会调用相应实例的 area 方法,因此我们可以获得不同的输出结果。

总结

Ruby 的多态性使得我们能够通过相同的接口来处理不同类型的对象。在面向对象编程中,多态性是实现代码复用和灵活性的重要手段。