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 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 CarBus, 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Á[email protected]@!!!!
    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!

    Nguồn: Viblo


Hãy đăng nhập để trả lời
 

Có vẻ như bạn đã mất kết nối tới LaptrinhX, vui lòng đợi một lúc để chúng tôi thử kết nối lại.