12/08/2018, 16:49

Class, object, module và mỗi quan hệ giữa chung

Ruby là một programming language mạnh mẽ, thấm nhuần tư tưởng OOP(hướng đối tượng). Nó thể hiện tính chất kế thừa thông qua class-based, có nghĩa là sự kế thừa được thể hiện qua class. Sử dụng ngôn ngữ ruby, chắc hẳn ai cũng sẽ quen thuộc với những khái niệm như class, object, module. Nhưng không ...

Ruby là một programming language mạnh mẽ, thấm nhuần tư tưởng OOP(hướng đối tượng). Nó thể hiện tính chất kế thừa thông qua class-based, có nghĩa là sự kế thừa được thể hiện qua class. Sử dụng ngôn ngữ ruby, chắc hẳn ai cũng sẽ quen thuộc với những khái niệm như class, object, module. Nhưng không phải ai cũng thật sự hiểu rõ ràng về chúng.

1. object

  • Định nghĩa: Theo OOP, đối tượng là một thể hiện trừu tượng của một sự vật trong thế giới thực, được con người mô hình hóa, ghi lại những tính chất và hành vi, để tạo nên thuộc tính(attribute) và phuơng thức (method) của object

2. Class

  • Định nghĩa: Class là bản thiết kế của object, thể hiện đặc điểm chung của một nhóm các object bằng cách tìm ra những thuộc tính và phuơng thức chung của object. Vấn đề này sẽ được rõ ràng hơn qua ví dụ sau: Một chiếc ô tô có các thuộc tính như màu sắc, giá trị, phiên bản. Nó có thể thực hiện các hành động như: đi, dừng, rẽ.. Và thế là chúng ta có một bản thiết kế chiếc ô tô: class name là tên của class, trong ví dụ này class name là Car. trong ruby, chúng ta define class bằng key word class
class Car
end

Hãy tưởng tượng class Car là một bản thiết kế: Chúng ta không thể lái một cái bản thiết kế!!!, chúng ta cần một chiếc ô tô thật: Và chiếc ô tô thật này mới là hiện thân của 1 object. object là một instance (thể hiện) của class Vậy làm sao để tạo ra một object trong ruby? Chúng ta sẽ tạo nên object dựa trên cơ sở là class. Ruby sử dụng method new để create một object.

class Car
    def drive
    end
end

car = Car.new

Giờ chúng ta đã có thể lái được chiếc xe rồi

car.drive

3. Module

  • Định nghĩa: Module là một tập hợp các câu lệnh, được gói lại, dùng để mix-in(nhúng) vào một hoặc nhiều class, module khác Ví dụ: Chúng ta có một class Car và Bus, 2 class này đều có thể lái, có thể dừng. Thay vì việc phải định nghĩa các hành vi này trong từng class, chúng ta sẽ tạo một module và nhúng nó vào 2 class này.
module Drive
  def drive
  end
    
  def stop
  end
end

class Car
  include Drive
end

class Bus
  include Drive
end

4. Class cũng là một object!!

Điều này có vẻ nghe hơi vô lí đúng không? Class sinh ra object, mà class lại là object, vậy thì object có thể sinh ra object????VÔ LÍ QUÁ????@@!!!! Nhưng sự thật luôn luôn phũ phàng, chúng ta sẽ kiểm chứng như sau: class Car end

Car.class #=> Class

Uầy, vậy ra Car là một thể hiện(instance) của một class được xây dựng sẵn của ruby, nó lên là Class. Và nếu nó là một thể hiện của một class nào đó => Nó là một object. Bức ảnh trên minh họa mỗi tuơng quan giữa các Car( class thông thường), class Object, class BasicObject và class Class À mà khoan đã!! Class cũng là một class, vậy thì Class cũng là object!! vậy thì nó là thể hiện của class nào? Class là một thể hiện của Class

5. Vậy module thì sao nhỉ?

Chúng ta sẽ bắt đầu từ Class

Class.superclass #=> Module

Vậy ra Class được kế thừa từ Module ( Module ở đây là class chứ không phải một module nhé) Thế tại sao Module lại là một class nhỉ? Tại vì ruby định nghĩa Module như sau

class Module
end

Module là một class, vậy thì nó có phải một thể hiện của class Class không nhỉ?

Module.class #=> Class

Còn module chúng ta hay sử dụng là instance của class Module

module A
end
A.class #=> Module

Sau bài viết này, hi vọng mọi người hiểu thêm về các định nghĩa object, class, module. Thân ái và quyết thắng!

0