Jupyter AI

18 Ruby 面向对象编程之继承与多态

📅 发表日期: 2024年8月15日

分类: 💎Ruby 语言入门

👁️阅读: --

在上篇中,我们讨论了如何在 Ruby 中创建对象,并介绍了对象的基本概念。今天,我们将深入探讨面向对象编程中的两个重要概念:继承多态。这两个特性使得代码的复用和扩展变得更加高效和灵活。

1. 继承

继承是面向对象编程的一个基本特性,允许一个类(子类)获取另一个类(父类)的方法和属性。通过继承,可以减少代码重复,提高代码的可维护性。

示例:简单的继承

让我们看一个简单的例子。假设我们有一个表示动物的父类 Animal

class Animal
  def speak
    "Animal sound"
  end
end

现在我们可以创建一个 Dog 类,继承自 Animal

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

在这个例子中,Dog 类继承了 Animal 类的 speak 方法,但我们也可以重写该方法以提供不同的实现。

使用继承

我们可以实例化 Dog 对象并调用它的 speak 方法:

dog = Dog.new
puts dog.speak  # 输出: Woof!

如果我们实例化一个 Animal 对象,键入相同的操作,我们会得到一个不同的结果:

animal = Animal.new
puts animal.speak  # 输出: Animal sound

继承链

继承不仅可以向下查找方法,也可以向上查找。当 Dog 类实例未能找到某个方法时,它会自动向 Animal 类查找该方法。这种机制被称为继承链

2. 多态

多态是指可以通过相同的接口调用不同的实现。在 Ruby 中,这是通过方法重写和鸭子类型实现的。

示例:多态的实现

继续使用上述 Animal 类的例子,我们再添加一个 Cat 类:

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

现在我们有了两个类 DogCat,它们都来自于 Animal 类并且重写了 speak 方法。

使用多态

我们可以定义一个方法,接受任何实现了 speak 方法的动物:

def make_animal_speak(animal)
  puts animal.speak
end

make_animal_speak(Dog.new)  # 输出: Woof!
make_animal_speak(Cat.new)  # 输出: Meow!

无论传递的是 Dog 还是 Catmake_animal_speak 方法都能正常工作,这就是多态的好处。

3. 小结

通过 继承,子类能够重复使用父类的代码并可以进行修改和扩展;而 多态 则使得不同类型的对象可以通过相同的接口进行交互。通过这两个强大的特性,我们能够编写出更加灵活和可维护的代码。

接下来,我们将在下一篇中讨论模块与包,特别是模块的概念,了解如何利用这些工具提高代码的组织性与重用性。