Lua(十七) 物件導向

2021-09-17 08:31:37 字數 2012 閱讀 7507

lua並不是乙個支援物件導向的語言,沒有類的概念,但是可以間接地去實現物件導向的功能

物件是由屬性+方法組成,lua中最基本的結構是table,我們可以用table來描述物件的屬性,function函式用來表示方法,所以lua中的物件導向是通過table+function模擬出來的

下面是lua模擬出的物件導向的例子:

物件由屬於和方法組成(下面的person表中有屬性有方法)

但是這樣存在一些問題!!!!!

————第乙個問題:

lua中的表是乙個引用型別,將person表賦值給a相當於person與a引用了同一塊記憶體空間,因為記憶體空間的銷毀是當它的所有引用都銷毀時才會被銷毀,所以當把person銷毀時,正常情況下應該仍然可以通過a訪問到記憶體空間中的資料,但是會報錯,因為呼叫的函式中使用了person.name,而person已經銷毀訪問不到person.name,所以會報錯

我們可以這樣解決:在函式中傳遞乙個引數

以上的方法還是比較麻煩,每次都需要將自身表當作引數傳入函式中,lua提供了另外一種方法(函式)的定義方式:

使用冒號來定義函式,我們可以在函式內部使用self,self代表呼叫者,當使用person:eat()時呼叫者就是person,當使用a:eat()時呼叫者就是a,同樣的,當呼叫方法時,也需要用冒號去呼叫,self會自動賦值引數,如果用點去呼叫則需要手動賦值引數

簡單來說就是當通過冒號呼叫方法時,系統會自動賦值呼叫者,當通過點呼叫方法時,需要手動賦值呼叫者

使用冒號的方式定義函式不能定義為匿名函式

——第二個問題:

定義不同的person時我們需要重新定義每個person中的屬性和方法

在lua中實現類的概念,需要先定義好乙個原型,也就是乙個模板

之後用元方法__index去實現lua中的類

完整**:當將person:new()賦值給person1時,person1就是返回值t,當輸出person1.name時,會先從t表中找,發現沒有,則從__index對應的模板表person中找,person1和person2是兩個不同的表,並不是引用同一塊記憶體空間

第二種帶引數的寫法:可以在建立物件時傳入乙個現有的物件(表),這樣我們就可以在原型模板的基礎上加入了現有的物件(表)

例如在乙個學校中,有老師和學生,他們有一些共同的屬性和方法,各自又有不同的屬性,這就需要利用繼承來實現:

建立teacher和student時,它們的元表都是person,之後建立student1,student2和teacher1時,它們的元表是student和teacher

lua物件導向

直接貼 參考的也是別人的,只不過其中幾點,增加一點自己的理解 local baseclass print baseclass是 tostring baseclass 定義index屬性,指向本身 baseclass.index baseclass 定義建構函式 function baseclass ...

Lua 物件導向

記錄學習過程 建立日期 2019 04 14 物件由屬性和方法組成。lua中最基本的結構是table,所以需要用table來描述物件的屬性。lua 中的 function 可以用來表示方法。那麼lua中的類可以通過 table function 模擬出來。乙個簡單的物件導向例子 屬性 person ...

Lua 物件導向

我們知道,物件由屬性和方法組成。lua中最基本的結構是table,所以需要用table來描述物件的屬性。lua中的function可以用來表示方法。那麼lua中的類可以通過table function模擬出來。至於繼承,可以通過metetable模擬出來 不推薦用,只模擬最基本的物件大部分夠用了 l...