Ruby 类和对象学习笔记

1. 类和实例

在 Ruby 中,一切皆为对象,每个对象都属于某个类。类可以看做是对象的模板,表示该类对象具有哪些属性和行为。我们可以通过定义类来创建新的对象。

定义类的语法如下:

rubyCopy Code
class ClassName # code end

其中 ClassName 为类名,# code 表示类中包含的代码。

我们通过 new 方法来创建该类的实例。例如:

rubyCopy Code
class Person def say_hello puts "Hello!" end end person = Person.new person.say_hello # 输出 "Hello!"

2. 属性和方法

类中可以定义属性和方法。属性指对象具有的某些特征,例如人的姓名、年龄等;方法指对象可以执行的操作,例如人可以说话、走路等。

定义属性

在 Ruby 中,我们可以通过 attr_readerattr_writerattr_accessor 定义属性。分别对应只读、只写和读写三种访问方式。

rubyCopy Code
class Person attr_reader :name # 只读属性 name attr_accessor :age # 读写属性 age def initialize(name, age) @name = name @age = age end end person = Person.new("Alice", 20) puts person.name # 输出 "Alice" puts person.age # 输出 20 person.age = 21 # 修改 age 属性值为 21 puts person.age # 输出 21

定义方法

定义方法的语法如下:

rubyCopy Code
class ClassName def method_name(arguments) # code end end

其中 method_name 是方法名,arguments 是方法的参数列表,# code 表示方法体。

举个例子:

rubyCopy Code
class Person def initialize(name, age) @name = name @age = age end def say_hello puts "Hello, I'm #{@name}, and I'm #{@age} years old." end end person = Person.new("Alice", 20) person.say_hello # 输出 "Hello, I'm Alice, and I'm 20 years old."

3. 继承

在 Ruby 中,我们可以通过继承来创建新的类。子类可以继承父类的属性和方法,并可以添加新的属性和方法。

继承的语法如下:

rubyCopy Code
class ChildClass < ParentClass # code end

其中 ChildClass 是子类,ParentClass 是父类,# code 表示子类中包含的代码。

举个例子:

rubyCopy Code
class Animal def move puts "Move!" end def eat puts "Eat!" end end class Dog < Animal def bark puts "Wang! Wang!" end end dog = Dog.new dog.move # 输出 "Move!" dog.eat # 输出 "Eat!" dog.bark # 输出 "Wang! Wang!"

4. 多态

多态是对象的一种属性,指不同的对象可以执行相同的方法,产生不同的结果。这样可以提高代码的复用性和可维护性。

举个例子:

rubyCopy Code
class Animal def make_sound # 抛出异常,需要子类实现该方法 raise "NotImplementedError" end end class Dog < Animal def make_sound puts "Wang! Wang!" end end class Cat < Animal def make_sound puts "Miao~ Miao~" end end animals = [Dog.new, Cat.new] animals.each do |animal| animal.make_sound end

上述代码创建了一个 Animal 类和两个子类 DogCat。它们都有自己的 make_sound 方法,但执行结果不同。我们将它们放到一个数组中,并逐一调用其 make_sound 方法,就可以看到多态的效果。