Class, object, module và mỗi quan hệ giữa chung
Bài đăng này đã không được cập nhật trong 3 năm
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!
All rights reserved