lua模擬物件導向程式設計中得繼承、多型,這裡也同時演示設計模式中得單利模式,類的實現都是通過lua中table,這個table太強大了,又可以當集合、陣列
--宣告,這裡宣告了類名還有屬性,並且給出了屬性的初始值。
class2 = {}
class2.a = "class2 aaa"
class2.b = "class2 bbb"
class2.c = "class2 ccc"
class2.__index = class2
--新建乙個例項物件並返回
function class2:new(data)
local self = {} --初始化self,如果沒有這句,那麼類所建立的物件改變,其他物件都會改變
setmetatable(self , class2) --將self的元表設定為class
self.a = data --屬性值初始化
return self --返回自身
end--這裡定義類的其他方法
function class2:func2()
print("class2 : func2")
endfunction class2:test()
print("class2 : test")
return "asdsd"
endfunction class2:ooo()
return 432
endfunction class2:ppp()
return 100
endfunction class2:qqq()
return self:ppp() * 2
end
require "class2" --因為繼承class2,所以這裡一定要包含class2檔案,否則報找不到方法的錯
-宣告類和屬性
class1 = {}
class1.u = "class1 uuu"
class1.i = "class1 iii"
--設定型別是class2
setmetatable(class1, class2)
--還是和類定義一樣,表索引設定為自身
class1.__index = class1
--新建乙個例項物件並返回
function class1:new(data,***)
local self = {}
self = class2:new(data)
setmetatable(self,class1)
self.u = ***
return self
end-- 新增新的方法
function class1:func1()
print("class1 : func1")
end-- 重寫父類中得ooo方法
function class1:ooo()
return 999
endfunction class1:ppp()
return 22
end
local a = class2:new("init data aaa")
a:func2()
print(a.a)
local b = class1:new("www","***啊")
b:func1()
print(b.a)
print(b.u)
b:func2()
local n = b:test()
print(n)
local m = b:ooo()
-- node:addchild(m)
print(m)
local h = class2:new("hhh")
print(h:qqq())
local j = class1:new("jjj","jjjnew")
print(j:qqq())
print(h:qqq())
結果:
local h = class2:new("hhh")
print(h:qqq())
local j = class1:new("jjj","jjjnew")
print(j:qqq())
print(h:qqq())
class1中重寫了ppp方法,返回另乙個值,呼叫父類class2中繼承下來的qqq方法時,qqq方法中的self:ppp()中的self指的是class1,這就實現的多型的行為
結果
catmanager = {} --新建乙個類
catmanager.num = 1 --定義num屬性並付志偉
catmanager.__index = catmanager --定義元表的索引,使之成為乙個類
function catmanager:new()
local self = {} --新建乙個例項物件
setmetatable(self,catmanager) --設定例項型別為catmanager
return self --返回例項物件
endfunction catmanager:getinstance()
if self.instance == nil then
self.instance = self:new()
endreturn self.instance
endfunction catmanager:func1()
print("catmanager func1")
end
local cat1 = catmanager:getinstance()
print(cat1.num)
cat1.num = cat1.num + 10
local cat2 = catmanager:getinstance()
print(cat2.num)
if cat1 == cat2 then
print("cat1和cat2兩個是同乙個物件")
end
[lua-print] 1
[lua-print] 11
[lua-print] cat1和cat2兩個是同乙個物件
Lua的物件導向,封裝,繼承,多型
我們總所周知物件是由屬性和方法組成的,要用lua要描述乙個物件,也必然要有這兩個特性,屬性和方法。lua的基本結構是table,所以lua的類,其實都是table,因為它可以儲存普通的變數又可以儲存方法,我們利用table就可以描述乙個物件的屬性和方法。其實lua要模擬乙個物件,關鍵就在於 inde...
java基礎 單利模式 繼承 多型
餓漢式單利模式 class mysingleton public static mysingleton getinstance 懶漢式單利模式 class mysingleton1 可重入函式也叫執行緒安全函式 public static mysingleton1 getinstance retur...
單利模式以及繼承和多型
一丶單利模式 1丶單利類只能有乙個例項 2丶單利類必須建立自己的唯一例項 3丶單利類必須給所有其它物件 4丶單利模式必須提供乙個全域性的訪問點 1 惡漢式單利模式 class mysingleton public static mysingleton getinstance 2 懶漢式單利模式 cl...