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

2021-09-25 14:48:02 字數 2182 閱讀 7916

local class = 

--設定類的__index為自己,當用此class作為元表的例項若在自己的屬性和方法中找不到,

--將會在其元表class的元方法鍵__index對應的元方法class查詢

class.__index = class

function class:new(x,y)

local instance = {} --初始化instance,如果沒有這句,那麼類所建立的物件如果有乙個改變,其他物件都會改變

setmetatable(instance, class) --與上面的class.__index = class對應,都有才能起效

instance.x = x

instance.y = y

return instance

endfunction class:plus()

self.x = self.x + 1

self.y = self.y + 1

endfunction class:test()

print(self.x,self.y)

end

–以上便建立了乙個類(作為父類)

–建立子類

local subclass =   

setmetatable(subclass, class)--(a)

subclass.__index = subclass

function subclass:new(x,y,z)

local instance = {}

instance = class:new(x,y)--(b) --將物件自身設定為父類,這個語句相當於其他語言的super ,可以理解為呼叫父類的建構函式

setmetatable(instance, subclass) --將例項物件自身元表設定為subclass類

instance.z= z --新的屬性初始化,如果沒有將會按照宣告=0

return instance

end--重定義父類的方法,相當於override

function subclass:test()

print(self.x,self.y,self.z)

end

--定義乙個新的方法

function subclass:go()

self.x = self.x + 10

end

–以上便建立乙個子類subclass,其父類為class;

–注意:若subclass去掉(a)(b),將使得subclass為乙個普通的類;

總結:

以上的兩個類如何實現了物件導向?

(1)封裝:在lua中的類,其實都是table,因為table既可以儲存普通變數又可以儲存函式或者另乙個table,利用這個特性,我們實現了物件導向的類中的方法、屬性(字段)和構造方法

(2)繼承:subclass的instance,如果在subclass中找不到的屬性和方法,將會去其元表class(父類)的__index中查詢,找到即可呼叫,實現了繼承父類特性

(3)多型:由於__index的查詢特性,例項會在自己的__index中查詢屬性和方法,找到即可呼叫,不會再繼續去父類中 查詢,即實現了函式覆蓋(c++覆蓋定義:總與多型繫結在一起,覆蓋發生在派生類與基類之間,兩個函式必須完全相 同,且都是虛函式)功能,即多型。

繼承與多型要歸功於table(元表中的__index)的查詢機制

local temp = 0

local a = class:new(1,2) -- 首先例項化父類的物件,並呼叫父類中的方法

a:plus()

a:test()

a = subclass:new(3,4,5) -- 然後例項化子類物件

a:plus() -- 子類物件可以訪問到父類中的成員和方法(繼承)

a:go() -- 子類物件呼叫子類中的新增方法

a:test() -- 子類物件呼叫重寫的方法(多型)

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

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

物件導向(封裝 繼承)

1.類的訪問修飾符有public private internal protected。其中pubulc 公共的,只要引用了命名空間,就可以隨意進行訪問 private 私有的,只有當前類內部才可以訪問 internal 內部的,當前程式集內可以訪問,程式集就是命名空間,此修飾符是預設的 prote...

物件導向 封裝 繼承

建構函式 建構函式 建立乙個類的函式 每乙個類都有建構函式,訪問修飾符必須是public的,並且不需要寫任何返回值,方法名與類名一致 自己寫的類 使用者自定義型別 如果要使用自定義型別產生出來的 物件 必須有乙個例項化的過程 例項化格式 型別名 ss new 建構函式 訪問修飾符 4個 public...