Ruby中的继承性如何运作?

82 阅读5分钟

什么是面向对象的编程(OOP)?

面向对象编程的目的是将现实世界的逻辑引入编程语言,以简化和组织代码。理解OOP的最简单和最常见的方法是以汽车制造商为例。所有的制造商都根据一个共享的地图或蓝图来制造汽车,其中包括车轮、车门、发动机等。换句话说,每辆汽车都建立在相同的组件上,但有自定义的属性和功能,这也使得每辆汽车可以做不同的事情。

OOP的基础是类,它是每个对象的地图。类定义了一个对象的各个方面和特征,以及它的行为。让我们看一个类的例子,开始分析它的不同方面。

class Car

  def initialize(name, doors, wheels, engine)
    @name = name
    @doors = doors
    @wheels = wheels
    @engine = engine
  end

  def start
    p "Car is on"
  end

  def stop
    p "Stop"
  end

  def accelerate(new_speed)
    @new_speed = new_speed
    p "#{@name} speed is #{new_speed}km/h"
  end
end

一个类的结构很简单,我们只需要用CamelCase惯例(Car)来命名这个类。在类的内部,我们有一个块或主体,包括我们需要的许多方法。

class NameClass
 #=> BLOCK
end

类中的第一个方法是初始化器构造器。当一个新的对象实例被创建时,这个方法被调用。

myCar = Car.new("Smart", 2, 4, "Turbo")

在这个例子中,这个实例是 "myCar",它是一个汽车对象,是一个有两个门、四个轮子和一个涡轮发动机的智能汽车。

在创建新实例时,构造函数(初始化器)会自动执行。所谓的属性是我们在调用我们类的方法new 时传递的数据。注意,为了与这些属性进行交互,我们需要定义getters和setters方法,当然,如果我们使用属性读取器、写入器和访问器,会更有效率。

在我们的类中的初始化器之后,我们将找到一组方法,这些方法将定制每个实例并定义其行为。例如,我们可以start 我们的实例并将其速度提高到50km/h,如下所示。

myCar.start
#=> Car is on
myCar.accelerate(50)
#=> Smart speed is 50km/h

什么是继承,它在Ruby中是如何工作的?

继承是一种重用代码的方式,因此一个类可以继承或获得另一个类的方法。顾名思义,继承遵循家族逻辑,我们可以识别父类和子类,最后一个是继承自父类的。请注意,一个类可以是多个类的父类,同时也是另一个类的子类。

表示类之间这种关系的语法是通过使用符号< ,如下所示。

class ElectricCar < Car
  ...
end

关于使用继承时的方法,必须要知道。

  • 当创建一个子类时,初始化方法也会被继承。
  • 任何方法都可以在子类中被订阅,以便通过定义同名的方法来定制它。

类与接口的继承

Ruby允许两种主要的继承类型的继承和接口的继承。到目前为止,我们一直在探索类的继承,其中我们有父类,也叫超类,和子类。

接口继承的不同之处在于,它平滑了层次关系,用于隔离某些类所接收(包括)的特定行为(方法)。这些行为被定义在模块中而不是类中。

module Repair
  def repair_engine
    p "The engine was repaired."
  end

  def change_oil
    p "The oil was changed."
  end

end

Repair 模块是有意义的,因为我们可以把它包含在我们的Car 类中,也可以包含在我们可能有的其他潜在车辆类中,比如自行车或卡车。按照这个例子,使用这个模块的方法是。

class ElectricCar < car
  include Repair
  ...
end

class Bike
  include Repair
  ...
end

请注意,模块不能被实例化,这意味着我们不能像对待类那样,通过使用new方法从模块中创建一个对象。

值得一提的是,在处理对象和继承时,无论是模块还是类,都要使用关键字self

如何在你的应用程序中实现继承

我们已经看到了类和接口继承的语法,现在是时候了解在一个遵循MVC架构的应用程序中如何实现它。

类的继承完全在应用程序的模型中执行。CarElectricCar 对象的路径都是如此。

# app/models/car.rb
# app/models/electric_car.rb

接口继承是通过模块来实现的,这些模块被建立在一个单独的文件夹中,随后被包含在继承自它的类的模型中。因此,Repair 模块的路径是。

lib/modules/repair.rb

关于继承的结论和最终想法

继承是Ruby中一个强大的功能,它被大量使用,因为它可以转化为代码的简单性、灵活性和可扩展性。最后,让我们列出继承的主要好处。

  1. 使你的代码保持干燥,并被认为是一种最佳实践。
  2. 使得更新和调试代码更加容易,因为它将结构分解为有组织的类、超类和模块。
  3. 通过使用简单的关联而不是重复的代码结构来节省内存。
  4. 构建强大的父类和模块,将其性能传递给其他类。
  5. 为开发团队节省了时间和精力。