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

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

1. 继承

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

示例:简单的继承

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

1
2
3
4
5
class Animal
def speak
"Animal sound"
end
end

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

1
2
3
4
5
class Dog < Animal
def speak
"Woof!"
end
end

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

使用继承

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

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

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

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

继承链

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

2. 多态

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

示例:多态的实现

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

1
2
3
4
5
class Cat < Animal
def speak
"Meow!"
end
end

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

使用多态

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

1
2
3
4
5
6
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. 小结

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

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

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

https://zglg.work/ruby-lang-zero/18/

作者

IT教程网(郭震)

发布于

2024-08-15

更新于

2024-08-16

许可协议

分享转发

学习下节

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论