面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,它使用“对象”来表示现实世界中的事物,通过封装、继承和多态等特性来实现代码的复用和模块化。在Ruby中,面向对象编程的应用非常广泛,以下是一些常见的应用场景:
封装是将对象的属性和方法隐藏起来,只暴露必要的接口。这样可以保护对象内部的状态不被外部直接修改,提高代码的安全性和可维护性。
class Car
attr_reader :make, :model, :year
def initialize(make, model, year)
@make = make
@model = model
@year = year
end
def drive
puts "Driving the #{@make} #{@model}..."
end
end
car = Car.new("Toyota", "Corolla", 2020)
car.drive
继承允许一个类(子类)继承另一个类(父类)的属性和方法。子类可以重写或扩展父类的方法,实现代码的复用。
class Vehicle
attr_accessor :make, :model, :year
def initialize(make, model, year)
@make = make
@model = model
@year = year
end
def drive
puts "Driving..."
end
end
class Car < Vehicle
def drive
puts "Driving the #{@make} #{@model}..."
end
end
bike = Vehicle.new("Honda", "CBR", 2021)
bike.drive
car = Car.new("Toyota", "Corolla", 2020)
car.drive
多态是指不同类的对象可以使用相同的接口。通过多态,可以在运行时根据对象的实际类型调用相应的方法,提高代码的灵活性和可扩展性。
class Vehicle
attr_accessor :make, :model, :year
def initialize(make, model, year)
@make = make
@model = model
@year = year
end
def drive
puts "Driving..."
end
end
class Car < Vehicle
def drive
puts "Driving the #{@make} #{@model}..."
end
end
class Motorcycle < Vehicle
def drive
puts "Riding the #{@make} #{@model}..."
end
end
vehicles = [Car.new("Toyota", "Corolla", 2020), Motorcycle.new("Honda", "CBR", 2021)]
vehicles.each do |vehicle|
vehicle.drive
end
模块是一种代码复用的方式,可以将一组相关的函数和方法封装在一个模块中,然后在其他类中通过include
关键字引入。
module Drivable
def drive
puts "Driving..."
end
end
class Vehicle
include Drivable
attr_accessor :make, :model, :year
def initialize(make, model, year)
@make = make
@model = model
@year = year
end
end
car = Vehicle.new("Toyota", "Corolla", 2020)
car.drive
抽象类是不能实例化的类,通常用于定义一些通用的方法和属性,供子类实现。
class Vehicle
attr_accessor :make, :model, :year
def initialize(make, model, year)
@make = make
@model = model
@year = year
end
def drive
raise NotImplementedError, "This method must be overridden in subclass"
end
end
class Car < Vehicle
def drive
puts "Driving the #{@make} #{@model}..."
end
end
class Motorcycle < Vehicle
def drive
puts "Riding the #{@make} #{@model}..."
end
end
vehicles = [Car.new("Toyota", "Corolla", 2020), Motorcycle.new("Honda", "CBR", 2021)]
vehicles.each do |vehicle|
vehicle.drive
end
通过这些面向对象编程的特性,Ruby可以编写出结构清晰、易于维护和扩展的代码。