📅  最后修改于: 2023-12-03 15:34:45.787000             🧑  作者: Mango
多态是面向对象编程中的一个重要概念,它允许不同的对象通过相同的接口进行交互和处理。Ruby是一种动态的、弱类型的面向对象编程语言,因此它天生地支持多态。
在 Ruby 中,不同的类可以继承相同的父类或包含相同的模块,这意味着它们会拥有相同的方法,我们可以使用这些方法来实现多态。
例如,我们有两个类 Dog
和 Cat
,它们都继承了 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
现在,我们可以创建一个数组,包含 Dog
和 Cat
的实例,并逐个调用它们的 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
参数。我们还定义了两个类 Circle
和 Rectangle
,它们都实现了 area
方法。
在调用 area
方法时,我们传入的参数可以是 Circle
或 Rectangle
类的实例,因为它们都实现了 area
方法。此时,根据传入的实例不同,area
方法内部会调用相应实例的 area
方法,因此我们可以获得不同的输出结果。
Ruby 的多态性使得我们能够通过相同的接口来处理不同类型的对象。在面向对象编程中,多态性是实现代码复用和灵活性的重要手段。