什么是面向对象的编程(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架构的应用程序中如何实现它。
类的继承完全在应用程序的模型中执行。Car 和ElectricCar 对象的路径都是如此。
# app/models/car.rb
# app/models/electric_car.rb
接口继承是通过模块来实现的,这些模块被建立在一个单独的文件夹中,随后被包含在继承自它的类的模型中。因此,Repair 模块的路径是。
lib/modules/repair.rb
关于继承的结论和最终想法
继承是Ruby中一个强大的功能,它被大量使用,因为它可以转化为代码的简单性、灵活性和可扩展性。最后,让我们列出继承的主要好处。
- 使你的代码保持干燥,并被认为是一种最佳实践。
- 使得更新和调试代码更加容易,因为它将结构分解为有组织的类、超类和模块。
- 通过使用简单的关联而不是重复的代码结构来节省内存。
- 构建强大的父类和模块,将其性能传递给其他类。
- 为开发团队节省了时间和精力。