Lua的物件導向,封裝,繼承,多型

2022-02-17 08:03:46 字數 3800 閱讀 5392

我們總所周知物件是由屬性和方法組成的,要用lua要描述乙個物件,也必然要有這兩個特性,屬性和方法。lua的基本結構是table,所以lua的類,其實都是table,因為它可以儲存普通的變數又可以儲存方法,我們利用table就可以描述乙個物件的屬性和方法。

其實lua要模擬乙個物件,關鍵就在於__index設定元表索引這塊,它主要起到索引失敗後該怎麼辦,如果它指向一張表,那麼__index索引失敗後,它會到這張表中去查詢有沒有你指定的函式或成員值,如果有,__index方法被呼叫時會返回該函式的返回值。

------ generated by emmylua( created by hwc--- datetime: 2019/12/10 10:14---

class =

class.__index =class

functionclass:new(x,y)

local self ={}

setmetatable(self,class)

self.x =x

self.y =y

returnself

endfunctionclass:getresult()

return 0

end

這樣乙個lua的物件就建立完成了。馬克思教育我們實踐是檢驗真理的唯一標準,所以我們用lua的寫物件導向的思想寫乙個計算器的demo來看下是怎麼實現繼承與多型。

繼承剛才寫得class類,就有了x,y值,可以進行加法運算,以此類推,我們進行減法,乘法,除法的類編寫

------ generated by emmylua( created by hwc--- datetime: 2019/12/10 10:17---

require("operation.operation")

addclass ={}

--設定元表為class

setmetatable(addclass,class)

addclass.__index =addclass

functionaddclass:new(x,y)

local self ={}

--呼叫父類的建構函式

self =class:new(x,y)

setmetatable(self,addclass)

returnself

end--重寫父類函式

functionaddclass:getresult()

return self.x +self.y

end

------ generated by emmylua( created by hwc.--- datetime: 2019/12/10 10:35---

require("operation.operation")

subclass ={}

setmetatable(subclass,class)

subclass.__index =subclass

functionsubclass:new(x,y)

local self ={}

self =class:new(x,y)

setmetatable(self,subclass)

returnself

endfunctionsubclass:getresult()

return self.x -self.y

end

------ generated by emmylua( created by hwc.--- datetime: 2019/12/10 10:39---

require("operation.operation")

mulclass ={}

setmetatable(mulclass,class)

mulclass.__index =mulclass

functionmulclass:new(x,y)

local self ={}

self =class:new(x,y)

setmetatable(self,mulclass)

returnself

endfunctionmulclass:getresult()

return self.x *self.y

end

------ generated by emmylua( created by hwc.--- datetime: 2019/12/10 10:42---

require("operation.operation")

divclass ={}

setmetatable(divclass,class)

divclass.__index =divclass

functiondivclass:new(x,y)

local self ={}

self =class:new(x,y)

setmetatable(self,divclass)

returnself

endfunctiondivclass:getresult()

if self.y == 0 then

print("除數不能為零")

return -1

endreturn self.x /self.y

end

我們建立乙個管理工廠類,管理所有運算。這樣一來我們如果要在新增乙個開根號或者平方執行,只要在新增根號類和修改工廠的**,其他就原封不動

------ generated by emmylua( created by hwc.--- datetime: 2019/12/10 10:46---

require("operation.operationadd")

require("operation.operationsub")

require("operation.operationmul")

require("operation.operationdiv")

factoryclass ={}

factoryclass.__index =factoryclass

functionfactoryclass:new(x,y,z)

local self ={}

setmetatable(self,factoryclass)

self.x =x

self.y =y

self.z =z

returnself

endfunctionfactoryclass:result()

local mytable ={}

if self.z == "+" thenmytable =addclass:new(self.x,self.y)

returnmytable

elseif self.z == "-" thenmytable =subclass:new(self.x,self.y)

returnmytable

elseif self.z == "*" thenmytable =mulclass:new(self.x,self.y)

returnmytable

elseif self.z == "/" thenmytable =divclass:new(self.x,self.y)

returnmytable

endend

新增乙個main類執行

乙個利用物件導向思想的lua簡單計算器就完成了,我們宰lua中模擬了類,繼承,和多型的特徵,起到了可復用,可擴充套件,解耦的特性,為lua開發web專案帶來了極大的便利

物件導向 封裝 繼承 多型

物件導向 封裝 繼承 多型物件導向 封裝 一 封裝 private 資料型別 名字 成員變數 public 預設一致 名字 屬性 set 類中不僅可以有成員變數和屬性,還可以有成員方法 訪問修飾符 4個 public 公共的,任何地方都可以訪問,但是需要引用 命名空間 private 私有的,類的內...

物件導向的封裝 繼承 多型

一 封裝 封裝是實現物件導向程式設計的第一步,封裝就是將資料或函式等集合在乙個個的單元中 我們稱之為類 被封裝的物件通常被稱為抽象資料型別。封裝的意義 封裝的意義在於保護或者防止 資料 被我們無意中破壞。在物件導向程式設計中資料被看作是乙個中心的元素並且和使用它的函式結合的很密切,從而保護它不被其它...

Lua之實現物件導向的封裝,繼承,多型 詳解

local class 設定類的 index為自己,當用此class作為元表的例項若在自己的屬性和方法中找不到,將會在其元表class的元方法鍵 index對應的元方法class查詢 class.index class function class new x,y local instance 初始...