Triển Khai Lập Trình Hướng Đối Tượng Bằng Lua - nói dối e blog

Triển Khai Lập Trình Hướng Đối Tượng Bằng Lua

Trong quyển “Programming in Lua” (PIL), tác giả ngôn ngữ Lua đã giới thiệu một giải pháp hướng đối tượng khá gọn nhẹ, tuy nhiên cá nhân tôi vẫn cảm thấy còn một chút phức tạp. Dưới đây là một giải pháp tinh tế hơn mà tôi đã đăng tải lên wiki để tiện quản lý mã nguồn và điều chỉnh khi cần:

Cơ chế hướng đối tượng trong Lua

Phiên bản này chỉ cần định nghĩa duy nhất một hàm class(super) để tạo lớp:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
base_type = class()    -- Khởi tạo lớp cơ sở base_type
function base_type:ctor(x) -- Định nghĩa hàm khởi tạo của base_type
  print("base_type ctor")
  self.x = x
end
function base_type:print_x()  -- Khai báo phương thức thành viên base_type:print_x
  print(self.x)
end
function base_type:hello() -- Thêm phương thức base_type:hello
  print("hello base_type")
end

Cú pháp khai báo lớp như trên hoàn toàn tương thích với phong cách lập trình Lua. Tôi đã thêm từ khóa đặc biệt ctor để xác định hàm khởi tạo, giúp mã nguồn dễ đọc hơn.

Kế thừa trong hệ thống này

Đây là cách tạo lớp con kế thừa từ lớp cha:

1
2
3
4
5
6
7
test = class(base_type) -- Tạo lớp test kế thừa từ base_type
function test:ctor()  -- Hàm khởi tạo của lớp test
  print("test ctor")
end
function test:hello()  -- Ghi đè phương thức hello() của lớp cha
  print("hello test")
end

Thử nghiệm kết quả

Bây giờ hãy kiểm tra khả năng vận hành:

1
2
3
a = test.new(1)  -- Kết quả xuất hiện 2 dòng: "base_type ctor" và "test ctor"
a:print_x() -- Xuất giá trị 1 - phương thức từ lớp cha base_type
a:hello()  -- Xuất "hello test" - phương thức đã được ghi đè

Mở rộng khả năng hệ thống

Thực tế, việc triển khai kế thừa đa lớp (multiple inheritance) trong cơ chế này cũng không quá phức tạp. Một hướng phát triển thú vị hơn có thể là bổ sung thêm hàm hủy (dtor) để quản lý vòng đời đối tượng hiệu quả hơn.

Lưu ý về kỹ thuật

Tôi đã áp dụng một mẹo nhỏ để ràng buộc self với closure, cho phép gọi phương thức thành viên trực tiếp qua a.hello thay vì a:hello. Tuy nhiên kỹ thuật này không mang lại hiệu suất vượt trội, nên cân nhắc sử dụng tùy trường hợp.

Nếu bạn tìm thấy bất kỳ ký tự tiếng Trung nào còn sót lại, vui lòng dịch hoàn toàn sang tiếng Việt để đảm bảo tính nhất quán của tài liệu!

0%