這是一個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