淺談Lua的面向?qū)ο筇匦?/h1>
更新時間:2015年05月29日 11:37:27 投稿:goldensun
這篇文章主要介紹了Lua的面向?qū)ο筇匦?包括對象和繼承等傳統(tǒng)OOP概念的幾個關(guān)鍵知識點,需要的朋友可以參考下
面向?qū)ο蟮奶匦?/p>
- 類: 類是可擴展的模板用來創(chuàng)建對象,提供狀態(tài)的初始值(成員變量)和行為的實現(xiàn)。
- 對象: 它是類的實例并具有分配給自己獨立的內(nèi)存。
- 繼承: 它是由變量和類的函數(shù)被其他類繼承的概念。
- 封裝: 它是將數(shù)據(jù)和函數(shù)相結(jié)合的一類內(nèi)的方法。數(shù)據(jù)可以在類的外部與函數(shù)的幫助下進行訪問。它也被稱為數(shù)據(jù)抽象。
Lua的OOP
在Lua中實現(xiàn)面向?qū)ο笈c表和Lua的第一類函數(shù)。通過將函數(shù)和相關(guān)數(shù)據(jù)插入表中形成一個對象。繼承可以在metatables的幫助下來實現(xiàn),提供了一個查找機制不存在的函數(shù)(方法)和在父對象字段。
在Lua表有這樣的狀態(tài)和標(biāo)識對象,它是獨立于值的特性。兩個對象(表),具有相同的值但在不同的對象,而一個對象可以具有在不同的值,但它始終是相同的對象。就像對象表中有一個生命周期,獨立創(chuàng)建或被創(chuàng)建。
一個真實世界的例子
面向?qū)ο蟮母拍钍菑V泛的,但要明白和獲取最大利益。
讓我們考慮一個簡單的數(shù)學(xué)例子。我們經(jīng)常會遇到,我們工作在不同的形狀像圓形,長方形和正方形的情況。
形狀可以有一個共同的屬性區(qū)。因此,我們可以從與共同屬性區(qū)域的基礎(chǔ)對象形狀擴展的其它形狀。每個形狀都可以有其自己的性質(zhì)和功能類似的矩形可以有屬性的長度,寬度,面積作為其屬性,printArea中和calculateArea作為它的函數(shù)。
創(chuàng)建一個簡單的類
一個簡單的類實現(xiàn)矩形三個屬性面積,長度和寬度如下所示。它也有一個printArea中功能打印所計算的面積。
復(fù)制代碼 代碼如下:-- Meta class
Rectangle = {area = 0, length = 0, breadth = 0}
-- 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)建對象
創(chuàng)建對象是類的實例分配存儲器的過程。每個對象具有它自己的存儲器和共享公用類數(shù)據(jù)。
復(fù)制代碼 代碼如下:r = Rectangle:new(nil,10,20)
訪問屬性
在類中用點 . 操作符,如下圖所示,可以訪問屬性
復(fù)制代碼 代碼如下:print(r.length)
訪問成員函數(shù)
使用冒號運算符,如下圖所示,可以訪問對象成員函數(shù)。
復(fù)制代碼 代碼如下:r:printArea()
存儲器被分配和初始值被設(shè)定。初始化過程可以比在其它面向?qū)ο蟮恼Z言構(gòu)造。它只是一項功能設(shè)定值,如上圖所示。
完整例子
讓我們來看看使用面向?qū)ο蟮腖ua中一個完整的例子。
復(fù)制代碼 代碼如下:-- Meta class
Shape = {area = 0}
-- 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)運行上面的程序,會得到如下的輸出。
復(fù)制代碼 代碼如下:The area is 100
Lua的繼承
繼承是擴展形狀簡單的基本對象,以矩形,正方形等的處理。它通常用于在真實世界中的共享和擴展的基本性質(zhì)和功能。
讓我們看一個簡單的類擴展。有一個類,如下圖所示。
復(fù)制代碼 代碼如下:-- Meta class
Shape = {area = 0}
-- 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
我們可以擴展的形狀為正方形類如下所示。
復(fù)制代碼 代碼如下: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
重載基礎(chǔ)函數(shù)
我們可以重載基類函數(shù)使用基類中的函數(shù),而不是派生類它自己再實現(xiàn),如下圖所示
復(fù)制代碼 代碼如下:-- Derived class method printArea
function Square:printArea ()
print("The area of square is ",self.area)
end
繼承完整的例子
Lua中我們可以擴展的簡單類實現(xiàn),如上圖所示metatables另一個新的方法。所有的成員變量和基類的函數(shù)被保留在派生類。
復(fù)制代碼 代碼如下: -- Meta class
Shape = {area = 0}
-- 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()
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)我們運行上面的程序,會得到下面的輸出。
復(fù)制代碼 代碼如下:The area is 100
The area of square is 100
The area of Rectangle is 200
在上面的例子中,我們創(chuàng)建了兩個派生類Rectangle和Square從基類Square。因此能夠在此改變基類的功能的派生類。在本實現(xiàn)例子中,派生類會取代函數(shù)printArea。
您可能感興趣的文章:- PHP入門教程之面向?qū)ο蟮奶匦苑治?繼承,多態(tài),接口,抽象類,抽象方法等)
- javascript面向?qū)ο蟪绦蛟O(shè)計高級特性經(jīng)典教程(值得收藏)
- C# 面向?qū)ο笕筇匦裕悍庋b、繼承、多態(tài)
- 深入理解Android組件間通信機制對面向?qū)ο筇匦缘挠绊懺斀?/a>
- 利用javascript的面向?qū)ο蟮奶匦詫崿F(xiàn)限制試用期
- php學(xué)習(xí)筆記 php中面向?qū)ο笕筇匦灾籟封裝性]的應(yīng)用
- Javascript 面向?qū)ο筇匦?/a>
- javascript 的面向?qū)ο筇匦詤⒖?/a>
- 面向?qū)ο笕筇匦缘囊饬x講解
相關(guān)文章
-
Lua中實現(xiàn)sleep函數(shù)功能的4種方法
這篇文章主要介紹了Lua中實現(xiàn)sleep函數(shù)功能的4種方法,本文講解了在一個死循環(huán)中設(shè)置一個跳出條件方法、調(diào)用系統(tǒng)的sleep函數(shù)法、Windows下ping命令法、socket庫中select函數(shù)法4種方法,需要的朋友可以參考下 2015-04-04
-
Lua編程示例(二):面向?qū)ο?、metatable對表進行擴展
這篇文章主要介紹了Lua編程示例(二):面向?qū)ο蟆etatable對表進行擴展,本文直接給出實例代碼,需要的朋友可以參考下 2015-07-07
最新評論
面向?qū)ο蟮奶匦?/p>
- 類: 類是可擴展的模板用來創(chuàng)建對象,提供狀態(tài)的初始值(成員變量)和行為的實現(xiàn)。
- 對象: 它是類的實例并具有分配給自己獨立的內(nèi)存。
- 繼承: 它是由變量和類的函數(shù)被其他類繼承的概念。
- 封裝: 它是將數(shù)據(jù)和函數(shù)相結(jié)合的一類內(nèi)的方法。數(shù)據(jù)可以在類的外部與函數(shù)的幫助下進行訪問。它也被稱為數(shù)據(jù)抽象。
Lua的OOP
在Lua中實現(xiàn)面向?qū)ο笈c表和Lua的第一類函數(shù)。通過將函數(shù)和相關(guān)數(shù)據(jù)插入表中形成一個對象。繼承可以在metatables的幫助下來實現(xiàn),提供了一個查找機制不存在的函數(shù)(方法)和在父對象字段。
在Lua表有這樣的狀態(tài)和標(biāo)識對象,它是獨立于值的特性。兩個對象(表),具有相同的值但在不同的對象,而一個對象可以具有在不同的值,但它始終是相同的對象。就像對象表中有一個生命周期,獨立創(chuàng)建或被創(chuàng)建。
一個真實世界的例子
面向?qū)ο蟮母拍钍菑V泛的,但要明白和獲取最大利益。
讓我們考慮一個簡單的數(shù)學(xué)例子。我們經(jīng)常會遇到,我們工作在不同的形狀像圓形,長方形和正方形的情況。
形狀可以有一個共同的屬性區(qū)。因此,我們可以從與共同屬性區(qū)域的基礎(chǔ)對象形狀擴展的其它形狀。每個形狀都可以有其自己的性質(zhì)和功能類似的矩形可以有屬性的長度,寬度,面積作為其屬性,printArea中和calculateArea作為它的函數(shù)。
創(chuàng)建一個簡單的類
一個簡單的類實現(xiàn)矩形三個屬性面積,長度和寬度如下所示。它也有一個printArea中功能打印所計算的面積。
Rectangle = {area = 0, length = 0, breadth = 0}
-- 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)建對象
創(chuàng)建對象是類的實例分配存儲器的過程。每個對象具有它自己的存儲器和共享公用類數(shù)據(jù)。
訪問屬性
在類中用點 . 操作符,如下圖所示,可以訪問屬性
訪問成員函數(shù)
使用冒號運算符,如下圖所示,可以訪問對象成員函數(shù)。
存儲器被分配和初始值被設(shè)定。初始化過程可以比在其它面向?qū)ο蟮恼Z言構(gòu)造。它只是一項功能設(shè)定值,如上圖所示。
完整例子
讓我們來看看使用面向?qū)ο蟮腖ua中一個完整的例子。
Shape = {area = 0}
-- 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)運行上面的程序,會得到如下的輸出。
Lua的繼承
繼承是擴展形狀簡單的基本對象,以矩形,正方形等的處理。它通常用于在真實世界中的共享和擴展的基本性質(zhì)和功能。
讓我們看一個簡單的類擴展。有一個類,如下圖所示。
Shape = {area = 0}
-- 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
我們可以擴展的形狀為正方形類如下所示。
-- 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
重載基礎(chǔ)函數(shù)
我們可以重載基類函數(shù)使用基類中的函數(shù),而不是派生類它自己再實現(xiàn),如下圖所示
function Square:printArea ()
print("The area of square is ",self.area)
end
繼承完整的例子
Lua中我們可以擴展的簡單類實現(xiàn),如上圖所示metatables另一個新的方法。所有的成員變量和基類的函數(shù)被保留在派生類。
Shape = {area = 0}
-- 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()
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)我們運行上面的程序,會得到下面的輸出。
The area of square is 100
The area of Rectangle is 200
在上面的例子中,我們創(chuàng)建了兩個派生類Rectangle和Square從基類Square。因此能夠在此改變基類的功能的派生類。在本實現(xiàn)例子中,派生類會取代函數(shù)printArea。
- PHP入門教程之面向?qū)ο蟮奶匦苑治?繼承,多態(tài),接口,抽象類,抽象方法等)
- javascript面向?qū)ο蟪绦蛟O(shè)計高級特性經(jīng)典教程(值得收藏)
- C# 面向?qū)ο笕筇匦裕悍庋b、繼承、多態(tài)
- 深入理解Android組件間通信機制對面向?qū)ο筇匦缘挠绊懺斀?/a>
- 利用javascript的面向?qū)ο蟮奶匦詫崿F(xiàn)限制試用期
- php學(xué)習(xí)筆記 php中面向?qū)ο笕筇匦灾籟封裝性]的應(yīng)用
- Javascript 面向?qū)ο筇匦?/a>
- javascript 的面向?qū)ο筇匦詤⒖?/a>
- 面向?qū)ο笕筇匦缘囊饬x講解
相關(guān)文章
Lua中實現(xiàn)sleep函數(shù)功能的4種方法
這篇文章主要介紹了Lua中實現(xiàn)sleep函數(shù)功能的4種方法,本文講解了在一個死循環(huán)中設(shè)置一個跳出條件方法、調(diào)用系統(tǒng)的sleep函數(shù)法、Windows下ping命令法、socket庫中select函數(shù)法4種方法,需要的朋友可以參考下2015-04-04Lua編程示例(二):面向?qū)ο?、metatable對表進行擴展
這篇文章主要介紹了Lua編程示例(二):面向?qū)ο蟆etatable對表進行擴展,本文直接給出實例代碼,需要的朋友可以參考下2015-07-07