18 Ruby 面向对象编程之继承与多态
在上篇中,我们讨论了如何在 Ruby 中创建对象,并介绍了对象的基本概念。今天,我们将深入探讨面向对象编程中的两个重要概念:继承
和多态
。这两个特性使得代码的复用和扩展变得更加高效和灵活。
1. 继承
继承
是面向对象编程的一个基本特性,允许一个类(子类)获取另一个类(父类)的方法和属性。通过继承,可以减少代码重复,提高代码的可维护性。
示例:简单的继承
让我们看一个简单的例子。假设我们有一个表示动物的父类 Animal
:
1 | class Animal |
现在我们可以创建一个 Dog
类,继承自 Animal
:
1 | class Dog < Animal |
在这个例子中,Dog
类继承了 Animal
类的 speak
方法,但我们也可以重写该方法以提供不同的实现。
使用继承
我们可以实例化 Dog
对象并调用它的 speak
方法:
1 | dog = Dog.new |
如果我们实例化一个 Animal
对象,键入相同的操作,我们会得到一个不同的结果:
1 | animal = Animal.new |
继承链
继承不仅可以向下查找方法,也可以向上查找。当 Dog
类实例未能找到某个方法时,它会自动向 Animal
类查找该方法。这种机制被称为继承链
。
2. 多态
多态
是指可以通过相同的接口调用不同的实现。在 Ruby 中,这是通过方法重写和鸭子类型实现的。
示例:多态的实现
继续使用上述 Animal
类的例子,我们再添加一个 Cat
类:
1 | class Cat < Animal |
现在我们有了两个类 Dog
和 Cat
,它们都来自于 Animal
类并且重写了 speak
方法。
使用多态
我们可以定义一个方法,接受任何实现了 speak
方法的动物:
1 | def make_animal_speak(animal) |
无论传递的是 Dog
还是 Cat
,make_animal_speak
方法都能正常工作,这就是多态的好处。
3. 小结
通过 继承
,子类能够重复使用父类的代码并可以进行修改和扩展;而 多态
则使得不同类型的对象可以通过相同的接口进行交互。通过这两个强大的特性,我们能够编写出更加灵活和可维护的代码。
接下来,我们将在下一篇中讨论模块与包,特别是模块的概念,了解如何利用这些工具提高代码的组织性与重用性。
18 Ruby 面向对象编程之继承与多态