Lua丨物件導向 屬性 函式方法 類 繼承

2021-08-27 17:57:08 字數 3114 閱讀 3976

--物件導向:對於乙個物件來說,屬性、方法

--人--屬性

person=

--方法1

person.eat=function()

print(person.name.."在吃飯")

endperson.eat()

--方法2

function person.eat()

print(person.name.."在吃飯")

endperson.eat()

--[[

方法3person=

person.eat()

--]]

>lua -e "io.stdout:setvbuf 'no'" "lua.lua"

skode在吃飯

skode在吃飯

>exit code: 0

但此時有乙個問題,即每次有新name時,都要重新定義person,形成person1、person2等等,非常不方便

person=

person.eat=function()

print(person.name.."在吃飯")

endperson.eat()

a=person

person=nil

a.eat()

--現執行報出錯誤,原因是當person=nil後,eat方法中無法呼叫person表,導致失敗。我們可改為如下所示,完成操作

>lua -e "io.stdout:setvbuf 'no'" "newlua.lua"

skode在吃飯

lua: newlua.lua:4: attempt to index global 'person' (a nil value)

stack traceback:

newlua.lua:4: in function 'eat'

newlua.lua:11: in main chunk

[c]: ?

>exit code: 1

修改後**,類似形參實參

person=

person.eat=function(self)

print(self.name.."在吃飯")

endperson.eat(person)

a=person

person=nil

a.eat(a)

>lua -e "io.stdout:setvbuf 'no'" "newlua.lua"

skode在吃飯

skode在吃飯

>exit code: 0

person=

function person:eat()

print(self.name.."在吃飯")

end--當用冒號時,不必寫引數,系統自動傳遞表給函式。self代表了當前呼叫eat函式的表

person:eat()

a=person

--person=nil

a:eat()

--當前仍可通過點來呼叫,不過需要手動給self賦值

a.eat(a)

>lua -e "io.stdout:setvbuf 'no'" "newlua.lua"

skode在吃飯

skode在吃飯

skode在吃飯

>exit code: 0

該效果即是:先定義乙個表,該錶下文稱為舊表。通過建構函式,讓新錶擁有舊表的所有資料。那怎樣實現該過程的呢,是通過元表功能

當呼叫該錶時,先從該錶搜尋是否有key,沒有再從元表修改;

當寫入跟元表相同內容時,新資料時直接寫到新錶中去的,並不會對元表造成影響,這時輸出時也是輸出的新錶內容

person=

--對person宣告新的new方法

function person:new()

local t={} --新錶 local是為避免在外界造成不必要影響

setmetatable(t,) --為新錶賦值元表,self指定person為元表

return t

endperson1=person:new()

person2=person:new()

print(person1.name)

person1.name="chengzi"

print(person1.name)

>lua -e "io.stdout:setvbuf 'no'" "newlua.lua"

skode

chengzi

>exit code: 0

person=

--對person宣告新的new方法

function person:new(o)

local t=o or {} --新錶

setmetatable(t,) --為新錶賦值元表,self指定person為元表

return t

endperson1=person:new()

person2=person:new()

print(person1.name)

person1.name="chengzi"

print(person1.weight)

>lua -e "io.stdout:setvbuf 'no'" "newlua.lua"

skode

100>exit code: 0

person=

--對person宣告新的new方法

function person:new(o)

t=o or {} --新錶

setmetatable(t,) --為新錶賦值元表,self指定person為元表

return t

endstudent=person:new()

student.grade=1

stu1=student:new()

print(stu1.name)

>lua -e "io.stdout:setvbuf 'no'" "newlua.lua"

skode

>exit code: 0

物件導向 字段 屬性 方法 建構函式

1 屬性 為了保護字段,屬性的本質是兩個方法,乙個是get 另乙個是set 2.靜態和非靜態的區別 在非靜態類中,可以有例項成員,也可以有靜態成員。在呼叫例項成員的時候,需要使用物件名.例項成員。在呼叫靜態成員的時候,需要使用類名.靜態成員名。總結 靜態成員需要用類名去呼叫,例項成員需要用物件名去呼...

Lua物件導向寫Student類

物件導向大家都不陌生了,lua可以使用表 table 元表 metatable 來模擬物件導向設計 我們來使用lua寫乙個簡單的student類 宣告型別 student 設定 index元方法 關鍵 student.index student 定義建構函式 function student cre...

Slog55 lua物件導向之lua類

現實中的事情不是根據人的喜好而定的 比如長在你嘴裡的智齒 大部分情況下 你會因為自己 的牙 而痛苦 直到忍痛拔掉 鮮血淋漓 也許痛過之後 才能回歸正途 需要的資訊和資訊源 desktop lua learningload lua class employee.lua 檔名為 employeepack...