首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

Lua 面向對象編程實踐:模塊、類、對象、繼承與靜態成員

     編輯:C++ 入門

Lua 中的 OOP 核心機制

Lua 本身無內建類機制,但通過 table 和 metatable 可完美模擬面向對象:

  • 模塊:獨立命名空間,本質是 table,需 require 載入
  • 類:只讀 table,通過 module() 創建
  • 對象:類的實例,通過設置 __index 元方法指向類實現繼承
  • 繼承:子類 metatable 的 __index 指向父類

代碼實現詳解

1. 定義類(模塊)

-- Student.lua
module("Student", package.seeall)

-- 公有靜態成員
flag = 1
-- 私有靜態成員(外部不可訪問)
local flag2 = 2

-- 非靜態方法(需傳 self)
function init(self, name)
    self.name = name  -- 非靜態成員變量
end

-- 靜態方法(不傳 self)
function getFlag()
    return flag
end

-- 非靜態方法
function getName(self)
    return self.name
end

2. 創建對象與繼承工具

-- tools.lua
-- 創建對象:空 table 設置 metatable 指向類
function new(moduleName)
    local obj = {}
    setmetatable(obj, {__index = moduleName})
    return obj
end

-- 繼承:子類 metatable 指向父類
function extend(child, parent)
    setmetatable(child, {__index = parent})
end

-- 創建並初始化對象
function create(moduleName, ...)
    local obj = new(moduleName)
    obj:init(...)
    return obj
end

3. 使用示例

require "tools"
require "Student"

-- 訪問靜態成員
print("flag =", Student.flag)
print("getFlag() =", Student.getFlag())

-- 創建對象
local obj = create(Student, "xiaoming")

-- 對象訪問靜態成員(通過 __index 找到類)
print("obj.flag =", obj.flag)
-- 訪問非靜態成員
print("obj.name =", obj.name)
-- 調用非靜態方法(冒號語法糖自動傳 self)
print("obj:getName() =", obj:getName())

4. 運行結果

flag = 1
getFlag() = 1
obj.flag = 1
obj.name = xiaoming
obj:getName() = xiaoming
運行結果截圖

關鍵概念總結

概念本質訪問方式
公有靜態成員模塊 table 中的字段Module.name
私有靜態成員模塊中的 local 變量僅模塊內部可訪問
非靜態成員變量對象 table 中的字段obj.name
靜態方法不接收 self 的函數Module.func()
非靜態方法首參為 self 的函數obj:func() 或 obj.func(obj)

注意事項

  1. Lua 無原生 static/非 static 概念,通過「屬於模塊還是屬於 self」區分
  2. : 只是語法糖,等價於 . 並自動傳遞 self
  3. package.seeall 允許模塊訪問全局環境
  4. 繼承鏈:obj -> class -> parentClass -> ...,由 __index 鏈實現

此模式輕量靈活,適合 Lua 腳本開發中的物件導向設計。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved