Lua 繼承 多型 單利模式 物件導向

2021-06-22 11:37:06 字數 3257 閱讀 7513

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...