Lập trình hướng đối tượng (OOP) là một phương pháp lập trình mạnh mẽ và phổ biến, giúp tổ chức mã nguồn một cách rõ ràng và dễ bảo trì. Ruby là một ngôn ngữ lập trình hướng đối tượng hoàn toàn, trong đó mọi thứ đều là đối tượng. Bài viết này sẽ đi sâu vào các khái niệm cơ bản và nâng cao của lập trình hướng đối tượng trong Ruby, bao gồm định nghĩa lớp, phương thức khởi tạo, biến instance, phương thức truy cập và thiết lập, phương thức instance, phương thức và biến lớp, phương thức to_s
, kiểm soát truy cập, kế thừa lớp, ghi đè phương thức, nạp chồng toán tử, đóng băng đối tượng, hằng số lớp, tạo đối tượng bằng allocate
, và thông tin lớp.
Định nghĩa lớp trong Ruby (Ruby Class Definition)
Trong Ruby, bạn có thể định nghĩa một lớp bằng từ khóa class
, theo sau là tên của lớp và kết thúc bằng từ khóa end
. Tên lớp phải bắt đầu bằng chữ cái viết hoa.
ruby
class Car
# Nội dung của lớp
end
Phương thức khởi tạo (The initialize Method)
Phương thức initialize
là một phương thức đặc biệt trong Ruby, được gọi tự động khi một đối tượng mới của lớp được tạo ra bằng phương thức new
. Phương thức này thường được sử dụng để khởi tạo các biến instance.
ruby
class Car
def initialize(make, model, year)
@make = make
@model = model
@year = year
end
end
car = Car.new("Toyota", "Corolla", 2020)
Biến instance (The instance Variables)
Biến instance trong Ruby bắt đầu bằng ký tự @
và chỉ có thể được truy cập từ bên trong đối tượng. Mỗi đối tượng có các biến instance riêng của nó.
ruby
class Car
def initialize(make, model, year)
@make = make
@model = model
@year = year
end
def display_details
puts "Make: #{@make}, Model: #{@model}, Year: #{@year}"
end
end
car = Car.new("Toyota", "Corolla", 2020)
car.display_details
Phương thức truy cập và thiết lập (The accessor & setter Methods)
Ruby cung cấp các phương thức attr_accessor
, attr_reader
, và attr_writer
để tự động tạo các phương thức truy cập và thiết lập cho các biến instance.
ruby
class Car
attr_accessor :make, :model, :year
def initialize(make, model, year)
@make = make
@model = model
@year = year
end
end
car = Car.new("Toyota", "Corolla", 2020)
puts car.make # Output: Toyota
car.year = 2021
puts car.year # Output: 2021
Phương thức instance (The instance Methods)
Phương thức instance là các phương thức được định nghĩa trong lớp và có thể được gọi trên các đối tượng của lớp đó.
ruby
class Car
attr_accessor :make, :model, :year
def initialize(make, model, year)
@make = make
@model = model
@year = year
end
def display_details
puts "Make: #{@make}, Model: #{@model}, Year: #{@year}"
end
end
car = Car.new("Toyota", "Corolla", 2020)
car.display_details
Phương thức và biến lớp (The class Methods and Variables)
Phương thức lớp là các phương thức được định nghĩa trên lớp thay vì trên các đối tượng của lớp. Chúng được định nghĩa bằng cách sử dụng từ khóa self
.
ruby
class Car
@@count = 0
def self.count
@@count
end
def initialize(make, model, year)
@make = make
@model = model
@year = year
@@count += 1
end
end
car1 = Car.new("Toyota", "Corolla", 2020)
car2 = Car.new("Honda", "Civic", 2021)
puts Car.count # Output: 2
Phương thức to_s
(The to_s Method)
Phương thức to_s
được sử dụng để trả về một chuỗi đại diện cho đối tượng. Nó thường được ghi đè để cung cấp một biểu diễn chuỗi tùy chỉnh của đối tượng.
ruby
class Car
attr_accessor :make, :model, :year
def initialize(make, model, year)
@make = make
@model = model
@year = year
end
def to_s
"Make: #{@make}, Model: #{@model}, Year: #{@year}"
end
end
car = Car.new("Toyota", "Corolla", 2020)
puts car.to_s # Output: Make: Toyota, Model: Corolla, Year: 2020
Kiểm soát truy cập (Access Control)
Ruby cung cấp ba mức độ bảo vệ cho các phương thức: public
, protected
, và private
. Mặc định, các phương thức là public
, trừ phương thức initialize
luôn là private
.
ruby
class Car
def initialize(make, model, year)
@make = make
@model = model
@year = year
end
def display_details
puts "Make: #{@make}, Model: #{@model}, Year: #{@year}"
end
private
def secret_method
puts "This is a secret method."
end
end
car = Car.new("Toyota", "Corolla", 2020)
car.display_details
# car.secret_method # Lỗi: private method `secret_method' called
Kế thừa lớp (Class Inheritance)
Kế thừa cho phép một lớp con kế thừa các thuộc tính và phương thức của một lớp cha. Trong Ruby, bạn sử dụng ký tự <
để chỉ định kế thừa.
ruby
class Vehicle
def initialize(make, model, year)
@make = make
@model = model
@year = year
end
def display_details
puts "Make: #{@make}, Model: #{@model}, Year: #{@year}"
end
end
class Car < Vehicle
def initialize(make, model, year, doors)
super(make, model, year)
@doors = doors
end
def display_details
super
puts "Doors: #{@doors}"
end
end
car = Car.new("Toyota", "Corolla", 2020, 4)
car.display_details
Ghi đè phương thức (Methods Overriding)
Ghi đè phương thức cho phép một lớp con cung cấp một triển khai khác cho một phương thức đã được định nghĩa trong lớp cha.
ruby
class Vehicle
def start
puts "Vehicle is starting."
end
end
class Car < Vehicle
def start
puts "Car is starting."
end
end
car = Car.new
car.start # Output: Car is starting.
Nạp chồng toán tử (Operator Overloading)
Ruby cho phép bạn ghi đè các toán tử để cung cấp hành vi tùy chỉnh cho các đối tượng của bạn.
ruby
class Box
attr_accessor :width, :height
def initialize(width, height)
@width = width
@height = height
end
def +(other)
Box.new(@width + other.width, @height + other.height)
end
def to_s
"Width: #{@width}, Height: #{@height}"
end
end
box1 = Box.new(10, 20)
box2 = Box.new(30, 40)
box3 = box1 + box2
puts box3 # Output: Width: 40, Height: 60
Đóng băng đối tượng (Freezing Objects)
Phương thức freeze
được sử dụng để đóng băng một đối tượng, ngăn không cho nó bị thay đổi.
ruby
str = "Hello"
str.freeze
# str << " World" # Lỗi: can't modify frozen String
Hằng số lớp (Class Constants)
Hằng số lớp là các giá trị không thay đổi được định nghĩa trong lớp. Chúng bắt đầu bằng chữ cái viết hoa.
ruby
class Car
WHEELS = 4
def self.wheels
WHEELS
end
end
puts Car.wheels # Output: 4
Tạo đối tượng bằng allocate
(Create Object Using Allocate)
Phương thức allocate
tạo một đối tượng mà không gọi phương thức khởi tạo initialize
.
ruby
class Car
def initialize(make, model, year)
@make = make
@model = model
@year = year
end
end
car = Car.allocate
puts car.inspect # Output: #<Car:0x00007f9c8b0b8b88>
Thông tin lớp (Class Information)
Ruby cung cấp nhiều phương thức để lấy thông tin về lớp và đối tượng.
ruby
class Car
end
car = Car.new
puts car.class # Output: Car
puts Car.superclass # Output: Object
puts car.is_a?(Car) # Output: true
Kết luận
Lập trình hướng đối tượng trong Ruby cung cấp một cách tiếp cận mạnh mẽ và linh hoạt để tổ chức và quản lý mã nguồn. Bằng cách sử dụng các khái niệm như lớp, đối tượng, kế thừa, và ghi đè phương thức, bạn có thể viết mã Ruby dễ đọc, dễ bảo trì và hiệu quả hơn