LuaOOP

這是一個Lua面向對象基礎類,並方便在Lua上進行面向對象編程。


使用方法:
這裏提供了兩個文件,OO.lua 和object.lua,功能完全一樣。區別:OO.lua使用了開頭Module("OO")聲明;object.lua沒有使用Module,並且最後返回了預置基礎了Object。

1.基本用法
 1.1 獲得基類
  1.1.1 使用OO.lua
    require "OO"
    -- 獲得預設基類
    local Object = OO.getBaseclass("Object")
    -- 打印類名
    print(Object)

  1.1.2 使用object.lua
    -- 獲得預設基類
    local Object=require "object"
    -- or
    -- local Object= getBaseclass("Object")
    -- 打印類名
    print(Object)

 1.2 聲明新類
    -- 聲明計算器類
    local Counter = Object:subclass("Counter", {
        --附加新數據
        count = 0,
    })
    -- or
    -- local Counter = OO.class("Counter", Object, {--附加新數據})
    -- or
    -- local Counter = class("Counter", Object, {--附加新數據})
    -- 打印類名
    print(Counter);

 1.3 聲明類方法
    function Counter:add()
        self.count = self.count + 1
    end
    function Counter:get()
        return self.count
    end
    
 1.4 新類實例化和調用
    local counter = Counter()
    -- 實例名
    print(counter)
    -- 調用和打印
    counter:add()
    print(counter:get(), counter.count)
    
 1.5 自定義構造函數
    function Counter:initialize(n)
        if n~=nil then
            self.count = n
        end
    end
    
    -- 實例化調用
    local counter = Counter(9)
    print(counter:get(), counter.count)
    
 1.6 構造中調用父類構造
    local SubCounter = Counter:subclass("SubCounter", {
        --附加新數據
        subcount = 0,
    })
    function SubCounter:initialize(n)
        -- 不需要保證父類構造在前的順序
        -- 調用父類構造初始化
        Counter.initialize(self, n)
        -- 自己初始化
        if n~=nil then
            self.subcount = n
        end
    end
    
2.高級用法
 2.1 運算符重載
    -- 可以重載函數有
    -[[ +: _add_imp(l, r)
        -: _sub_imp(l, r)
        *: _mul_imp(l, r)
        /: _div_imp(l, r)
        %: _mod_imp(l, r)
        ^: _pow_imp(l, r)
        -: _unm_imp(v) -- 取負符號,比如1取負:-1
        ..: _concat_imp(l, r) -- 字符串鏈接符號
        #: _len_imp(v) -- 取大小符號
        ==: _eq_imp(l, r)
        <: _lt_imp(l, r)
        <=: _le_imp(l, r)
    ]]
 
    -- 例子
    function Counter._add_imp(left, right)
        return Counter(left.count+right.count)
    end
    -- 實例化調用
    local counter1 = Counter(1)
    local counter2 = Counter(2)
    local counter3 = counter1 + counter2
    print(counter3.count)
    
 2.2 其他重載
    -- 重載tostring方法
    function Counter:_tostring_imp()
        return tostring(self.count)
    end
    -- 測試
    local counter = Counter(5)
    print(counter, counter.count)
 
 2.3 新的基類
    -- 聲明新的基類,無法聲明已經存在的基類,比如無法再聲明一個叫"Object"的基類
    local myObject = OO.baseclass("myObject"--[[, {--附加數據}]])
    -- or
    -- local myObject = baseclass("myObject");
    -- 聲明完成後會記錄到基類表中,所以可以通過getBaseclass()來獲得
    local myObject = OO.getBaseclass("myObject")

3.其他函數
 3.1 baseclass:getClass(name)、baseclass.getClassFromFullName、getClass(name, baseclass)
    -- 用於獲得已經存在類
    -- 例子
    local A=Object:subclass("A")
    A:subclass("B")
    
    -- 獲取A類
    local A = Object:getClass("A")
    -- or
    -- local A = Object.getClassFromFullName("Object.A")
    -- or
    -- 當baseclass參數不填時,默認從預設基類中找
    -- local A = getClass("Object.A", --[[Object]])
    
    -- 獲取B類
    local B = A:getClass("B")
    -- or
    -- local B = Object:getClass("A.B")
    -- or
    -- local B = Object.getClassFromFullName("Object.A.B")
    -- or
    -- 當baseclass參數不填時,默認從預設基類中找
    -- local B = getClass("Object.A.B", --[[Object]])
    
 3.2 獲得父類
    local A = B.__super;
    
 3.3 類命名規則
    -- A類名
    local A = Object:getClass("A")
    print(A) -- > Object.A
    -- B名
    local B = A:getClass("B")
    print(B) -- > Object.A.B
    -- B 實例
    local b = B()
    print(b) -- > Object.A.B.Instance
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章