面向对象编程(Object-Oriented Programming, OOP)是一种编程范式,它使用“对象”来设计软件。Ruby 是一种纯粹的面向对象的语言,几乎所有的操作都是通过对象进行的。在这一章中,我们将深入探讨 Ruby 的面向对象编程特性。
类与实例
定义类
在 Ruby 中,类是创建对象的蓝图或模板。类定义了对象的属性和行为。你可以使用 class 关键字来定义一个类:
class Person end
创建实例
一旦定义了一个类,就可以通过 new 方法创建该类的对象(也称为实例)。每个实例都有自己的属性和方法。
person = Person.new
属性
在 Ruby 中,属性可以通过实例变量(以 @ 开头)来表示。虽然可以直接访问这些实例变量,但通常推荐使用 getter 和 setter 方法来访问和修改它们。
// www.javascriptcn.com code example
class Person
def initialize(name)
@name = name
end
def name
@name
end
def name=(value)
@name = value
end
end
person = Person.new("Alice")
puts person.name # 输出 "Alice"
person.name = "Bob"
puts person.name # 输出 "Bob"私有方法
在 Ruby 中,可以将某些方法标记为私有的,这意味着这些方法只能被同一个类中的其他方法调用。这可以通过 private 关键字来实现:
// www.javascriptcn.com code example
class Person
def initialize(name)
@name = name
end
def greet
say_hello
end
private
def say_hello
puts "Hello, #{@name}!"
end
end
person = Person.new("Alice")
person.greet # 输出 "Hello, Alice!"
# person.say_hello # 这将导致错误,因为 say_hello 是私有的继承
继承是面向对象编程中的一个重要概念,它允许一个类(子类)继承另一个类(父类)的属性和方法。这有助于代码重用和组织结构。
定义父类和子类
// www.javascriptcn.com code example
class Animal
def speak
"Some sound"
end
end
class Dog < Animal
def speak
"Woof!"
end
end
class Cat < Animal
def speak
"Meow!"
end
end覆盖和方法调用
子类可以覆盖父类的方法,或者通过 super 关键字调用父类的方法。
// www.javascriptcn.com code example
class Animal
def speak
"Some sound"
end
end
class Dog < Animal
def speak
super + ", Woof!"
end
end
dog = Dog.new
puts dog.speak # 输出 "Some sound, Woof!"多态
多态是指不同类的对象对同一消息做出响应的能力。Ruby 支持多态,因为它允许你使用相同的接口调用不同对象的方法。
// www.javascriptcn.com code example
class Animal
def speak
"Some sound"
end
end
class Dog < Animal
def speak
"Woof!"
end
end
class Cat < Animal
def speak
"Meow!"
end
end
def animal_sound(animal)
animal.speak
end
puts animal_sound(Dog.new) # 输出 "Woof!"
puts animal_sound(Cat.new) # 输出 "Meow!"模块与混合
模块是用于命名空间和混入功能的一种方式。模块不能实例化,但可以包括方法、常量和类。模块的一个重要用途是作为混入(mixin)来共享功能。
定义和使用模块
// www.javascriptcn.com code example
module Walkable
def walk
puts "#{self} is walking."
end
end
class Person
include Walkable
attr_accessor :name
def initialize(name)
@name = name
end
def to_s
@name
end
end
person = Person.new("Alice")
person.walk # 输出 "Alice is walking."命名空间
模块也可以用来创建命名空间,防止名称冲突。
module MyModule class MyClass end end obj = MyModule::MyClass.new
小结
本章介绍了 Ruby 中面向对象编程的核心概念,包括类与实例、继承、多态以及模块与混合。这些基础知识将帮助你在实际项目中有效地使用 Ruby 的面向对象特性。下一章我们将继续探讨 Ruby 的其他高级特性。