Lua面向對象

面向對象特征
1) 封裝:指能夠把一個實體的信息、功能、響應都裝入一個單獨的對象中的特性。
2) 繼承:繼承的方法允許在不改動原程序的基礎上對其進行擴充,這樣使得原功能得以保存,而新功能也得以擴展。這有利于減少重復編碼,提高軟件的開發效率。
3) 多態:同一操作作用于不同的對象,可以有不同的解釋,產生不同的執行結果。在運行時,可以通過指向基類的指針,來調用實現派生類中的方法。
4)抽象:抽象(Abstraction)是簡化復雜的現實問題的途徑,它可以為具體問題找到最恰當的類定義,并且可以在最恰當的繼承級別解釋問題。
Lua 中面向對象
我們知道,對象由屬性和方法組成。LUA中最基本的結構是table,所以需要用table來描述對象的屬性。
lua中的function可以用來表示方法。那么LUA中的類可以通過table + function模擬出來。
至于繼承,可以通過metetable模擬出來(不推薦用,只模擬最基本的對象大部分時間夠用了)。
Lua中的表不僅在某種意義上是一種對象。像對象一樣,表也有狀態(成員變量);也有與對象的值獨立的本性,特別是擁有兩個不同值的對象(table)代表兩個不同的對象;一個對象在不同的時候也可以有不同的值,但他始終是一個對象;與對象類似,表的生命周期與其由什么創建、在哪創建沒有關系。
簡單的實例

person={name="lian",age=22}

-- function person.eat(self)
--   print(self.name.."正在吃飯")
-- end

function person:eat()
    print(self.name.."正在吃飯")
  end
  

--[[
function person:eat()
  print(self.name.."正在吃飯")
end
]]--

-- a=person
-- person=nil

--當通過:調用的時候,系統會自動傳遞當前table給self
--當通過.來調用方法的時候,self不會自動賦值,
--我們必須通過第一個參數來傳遞當前的table
-- a.eat(a)
-- a:eat()


function person:new(o)
--如果o is nuil 也就是false就會返回{}
local t=o or{}
--調用一個屬性的時候,如果t中不存在,那么會在--index所指定的table中查找
--setmetatable(t,{__index=self})
setmetatable(t,self)
self.__index=self

return t
end
person1=person:new({weight=100})
person1.name="persion1"
print(person1.name)
print(person1.weight)

person2=person:new()
person2.name="persion2"
print(person2.name)
print(person.name)

輸出結果

persion1
100
persion2
lian

面向對象繼承

Student=person:new()
Student.grad=1
stu1=Student:new()
stu1:eat()
print(stu1.grad)

輸出

lian正在吃飯
1
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容