Khóa học ruby

Lập trình hướng đối tượng trong Ruby

0 phút đọc

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.

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.

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ó.

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.

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 đó.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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

Avatar
Được viết bởi

TechMely Team

Gợi ý câu hỏi phỏng vấn

Gợi ý bài viết

Bình luận

Chưa có bình luận nào

Khoá học javascript từ cơ bản đến chuyên sâuYoutube Techmely