面向?qū)ο蟮奶匦?/p>
Lua的OOP
在Lua中實(shí)現(xiàn)面向?qū)ο笈c表和Lua的第一類函數(shù)。通過將函數(shù)和相關(guān)數(shù)據(jù)插入表中形成一個(gè)對(duì)象。繼承可以在metatables的幫助下來實(shí)現(xiàn),提供了一個(gè)查找機(jī)制不存在的函數(shù)(方法)和在父對(duì)象字段。
在Lua表有這樣的狀態(tài)和標(biāo)識(shí)對(duì)象,它是獨(dú)立于值的特性。兩個(gè)對(duì)象(表),具有相同的值但在不同的對(duì)象,而一個(gè)對(duì)象可以具有在不同的值,但它始終是相同的對(duì)象。就像對(duì)象表中有一個(gè)生命周期,獨(dú)立創(chuàng)建或被創(chuàng)建。
一個(gè)真實(shí)世界的例子
面向?qū)ο蟮母拍钍菑V泛的,但要明白和獲取最大利益。
讓我們考慮一個(gè)簡(jiǎn)單的數(shù)學(xué)例子。我們經(jīng)常會(huì)遇到,我們工作在不同的形狀像圓形,長(zhǎng)方形和正方形的情況。
形狀可以有一個(gè)共同的屬性區(qū)。因此,我們可以從與共同屬性區(qū)域的基礎(chǔ)對(duì)象形狀擴(kuò)展的其它形狀。每個(gè)形狀都可以有其自己的性質(zhì)和功能類似的矩形可以有屬性的長(zhǎng)度,寬度,面積作為其屬性,printArea中和calculateArea作為它的函數(shù)。
創(chuàng)建一個(gè)簡(jiǎn)單的類
一個(gè)簡(jiǎn)單的類實(shí)現(xiàn)矩形三個(gè)屬性面積,長(zhǎng)度和寬度如下所示。它也有一個(gè)printArea中功能打印所計(jì)算的面積。
-- Derived class method new
function Rectangle:new (o,length,breadth)
o = o or {}
setmetatable(o, self)
self.__index = self
self.length = length or 0
self.breadth = breadth or 0
self.area = length*breadth;
return o
end
-- Derived class method printArea
function Rectangle:printArea ()
print("The area of Rectangle is ",self.area)
end
創(chuàng)建對(duì)象
創(chuàng)建對(duì)象是類的實(shí)例分配存儲(chǔ)器的過程。每個(gè)對(duì)象具有它自己的存儲(chǔ)器和共享公用類數(shù)據(jù)。
訪問屬性
在類中用點(diǎn) . 操作符,如下圖所示,可以訪問屬性
訪問成員函數(shù)
使用冒號(hào)運(yùn)算符,如下圖所示,可以訪問對(duì)象成員函數(shù)。
存儲(chǔ)器被分配和初始值被設(shè)定。初始化過程可以比在其它面向?qū)ο蟮恼Z言構(gòu)造。它只是一項(xiàng)功能設(shè)定值,如上圖所示。
完整例子
讓我們來看看使用面向?qū)ο蟮腖ua中一個(gè)完整的例子。
-- Base class method new
function Shape:new (o,side)
o = o or {}
setmetatable(o, self)
self.__index = self
side = side or 0
self.area = side*side;
return o
end
-- Base class method printArea
function Shape:printArea ()
print("The area is ",self.area)
end
-- Creating an object
myshape = Shape:new(nil,10)
myshape:printArea()
當(dāng)運(yùn)行上面的程序,會(huì)得到如下的輸出。
Lua的繼承
繼承是擴(kuò)展形狀簡(jiǎn)單的基本對(duì)象,以矩形,正方形等的處理。它通常用于在真實(shí)世界中的共享和擴(kuò)展的基本性質(zhì)和功能。
讓我們看一個(gè)簡(jiǎn)單的類擴(kuò)展。有一個(gè)類,如下圖所示。
我們可以擴(kuò)展的形狀為正方形類如下所示。
重載基礎(chǔ)函數(shù)
我們可以重載基類函數(shù)使用基類中的函數(shù),而不是派生類它自己再實(shí)現(xiàn),如下圖所示
繼承完整的例子
Lua中我們可以擴(kuò)展的簡(jiǎn)單類實(shí)現(xiàn),如上圖所示metatables另一個(gè)新的方法。所有的成員變量和基類的函數(shù)被保留在派生類。
-- Creating an object
myshape = Shape:new(nil,10)
myshape:printArea()
Square = Shape:new()
-- Derived class method new
function Square:new (o,side)
o = o or Shape:new(o,side)
setmetatable(o, self)
self.__index = self
return o
end
-- Derived class method printArea
function Square:printArea ()
print("The area of square is ",self.area)
end
-- Creating an object
mysquare = Square:new(nil,10)
mysquare:printArea()
Rectangle = Shape:new()
-- Derived class method new
function Rectangle:new (o,length,breadth)
o = o or Shape:new(o)
setmetatable(o, self)
self.__index = self
self.area = length * breadth
return o
end
-- Derived class method printArea
function Rectangle:printArea ()
print("The area of Rectangle is ",self.area)
end
-- Creating an object
myrectangle = Rectangle:new(nil,10,20)
myrectangle:printArea()
當(dāng)我們運(yùn)行上面的程序,會(huì)得到下面的輸出。
在上面的例子中,我們創(chuàng)建了兩個(gè)派生類Rectangle和Square從基類Square。因此能夠在此改變基類的功能的派生類。在本實(shí)現(xiàn)例子中,派生類會(huì)取代函數(shù)printArea。
標(biāo)簽:營(yíng)口 臨滄 昌都 泰安 南京 西寧 宿遷
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《淺談Lua的面向?qū)ο筇匦浴?,本文關(guān)鍵詞 淺談,Lua,的,面向,對(duì)象,特性,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。