Lua 面向?qū)ο?/h1>
面向?qū)ο缶幊蹋∣bject Oriented Programming,OOP)是一種非常流行的計(jì)算機(jī)編程架構(gòu)。
以下幾種編程語(yǔ)言都支持面向?qū)ο缶幊蹋?/p>
C++
Java
Objective-C
Smalltalk
C#
Ruby
面向?qū)ο筇卣?/h2>1) 封裝:指能夠把一個(gè)實(shí)體的信息、功能、響應(yīng)都裝入一個(gè)單獨(dú)的對(duì)象中的特性。
2) 繼承:繼承的方法允許在不改動(dòng)原程序的基礎(chǔ)上對(duì)其進(jìn)行擴(kuò)充,這樣使得原功能得以保存,而新功能也得以擴(kuò)展。這有利于減少重復(fù)編碼,提高軟件的開(kāi)發(fā)效率。
3) 多態(tài):同一操作作用于不同的對(duì)象,可以有不同的解釋?zhuān)a(chǎn)生不同的執(zhí)行結(jié)果。在運(yùn)行時(shí),可以通過(guò)指向基類(lèi)的指針,來(lái)調(diào)用實(shí)現(xiàn)派生類(lèi)中的方法。
4)抽象:抽象(Abstraction)是簡(jiǎn)化復(fù)雜的現(xiàn)實(shí)問(wèn)題的途徑,它可以為具體問(wèn)題找到最恰當(dāng)?shù)念?lèi)定義,并且可以在最恰當(dāng)?shù)睦^承級(jí)別解釋問(wèn)題。
Lua 中面向?qū)ο?/h2>
我們知道,對(duì)象由屬性和方法組成。LUA中最基本的結(jié)構(gòu)是table,所以需要用table來(lái)描述對(duì)象的屬性。
lua中的function可以用來(lái)表示方法。那么LUA中的類(lèi)可以通過(guò)table + function模擬出來(lái)。
至于繼承,可以通過(guò)metetable模擬出來(lái)(不推薦用,只模擬最基本的對(duì)象大部分時(shí)間夠用了)。
Lua中的表不僅在某種意義上是一種對(duì)象。像對(duì)象一樣,表也有狀態(tài)(成員變量);也有與對(duì)象的值獨(dú)立的本性,特別是擁有兩個(gè)不同值的對(duì)象(table)代表兩個(gè)不同的對(duì)象;一個(gè)對(duì)象在不同的時(shí)候也可以有不同的值,但他始終是一個(gè)對(duì)象;與對(duì)象類(lèi)似,表的生命周期與其由什么創(chuàng)建、在哪創(chuàng)建沒(méi)有關(guān)系。對(duì)象有他們的成員函數(shù),表也有:
Account = {balance = 0}
function Account.withdraw (v)
Account.balance = Account.balance - v
end
這個(gè)定義創(chuàng)建了一個(gè)新的函數(shù),并且保存在Account對(duì)象的withdraw域內(nèi),下面我們可以這樣調(diào)用:
Account.withdraw(100.00)
一個(gè)簡(jiǎn)單實(shí)例
以下簡(jiǎn)單的類(lèi)包含了三個(gè)屬性: area, length 和 breadth,printArea方法用于打印計(jì)算結(jié)果:
-- Meta class
Rectangle = {area = 0, length = 0, breadth = 0}
-- 派生類(lèi)的方法 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
-- 派生類(lèi)的方法 printArea
function Rectangle:printArea ()
print("矩形面積為 ",self.area)
end
創(chuàng)建對(duì)象
創(chuàng)建對(duì)象是位類(lèi)的實(shí)例分配內(nèi)存的過(guò)程。每個(gè)類(lèi)都有屬于自己的內(nèi)存并共享公共數(shù)據(jù)。
r = Rectangle:new(nil,10,20)
訪問(wèn)屬性
我們可以使用點(diǎn)號(hào)(.)來(lái)訪問(wèn)類(lèi)的屬性:
print(r.length)
訪問(wèn)成員函數(shù)
我們可以使用冒號(hào)(:)來(lái)訪問(wèn)類(lèi)的屬性:
r:printArea()
內(nèi)存在對(duì)象初始化時(shí)分配。
完整實(shí)例
以下我們演示了 Lua 面向?qū)ο蟮耐暾麑?shí)例:
-- Meta class
Shape = {area = 0}
-- 基礎(chǔ)類(lèi)方法 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
-- 基礎(chǔ)類(lèi)方法 printArea
function Shape:printArea ()
print("面積為 ",self.area)
end
-- 創(chuàng)建對(duì)象
myshape = Shape:new(nil,10)
myshape:printArea()
執(zhí)行以上程序,輸出結(jié)果為:
面積為 100
Lua 繼承
繼承是指一個(gè)對(duì)象直接使用另一對(duì)象的屬性和方法??捎糜跀U(kuò)展基礎(chǔ)類(lèi)的屬性和方法。
以下演示了一個(gè)簡(jiǎn)單的繼承實(shí)例:
-- Meta class
Shape = {area = 0}
-- 基礎(chǔ)類(lèi)方法 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
-- 基礎(chǔ)類(lèi)方法 printArea
function Shape:printArea ()
print("面積為 ",self.area)
end
接下來(lái)的實(shí)例,Square 對(duì)象繼承了 Shape 類(lèi):
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
完整實(shí)例
以下實(shí)例我們繼承了一個(gè)簡(jiǎn)單的類(lèi),來(lái)擴(kuò)展派生類(lèi)的方法,派生類(lèi)中保留了繼承類(lèi)的成員變量和方法:
-- Meta class
Shape = {area = 0}
-- 基礎(chǔ)類(lèi)方法 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
-- 基礎(chǔ)類(lèi)方法 printArea
function Shape:printArea ()
print("面積為 ",self.area)
end
-- 創(chuàng)建對(duì)象
myshape = Shape:new(nil,10)
myshape:printArea()
Square = Shape:new()
-- 派生類(lèi)方法 new
function Square:new (o,side)
o = o or Shape:new(o,side)
setmetatable(o, self)
self.__index = self
return o
end
-- 派生類(lèi)方法 printArea
function Square:printArea ()
print("正方形面積為 ",self.area)
end
-- 創(chuàng)建對(duì)象
mysquare = Square:new(nil,10)
mysquare:printArea()
Rectangle = Shape:new()
-- 派生類(lèi)方法 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
-- 派生類(lèi)方法 printArea
function Rectangle:printArea ()
print("矩形面積為 ",self.area)
end
-- 創(chuàng)建對(duì)象
myrectangle = Rectangle:new(nil,10,20)
myrectangle:printArea()
執(zhí)行以上代碼,輸出結(jié)果為:
面積為 100
正方形面積為 100
矩形面積為 200
函數(shù)重寫(xiě)
Lua 中我們可以重寫(xiě)基礎(chǔ)類(lèi)的函數(shù),在派生類(lèi)中定義自己的實(shí)現(xiàn)方式:
-- 派生類(lèi)方法 printArea
function Square:printArea ()
print("正方形面積 ",self.area)
end
面向?qū)ο缶幊蹋∣bject Oriented Programming,OOP)是一種非常流行的計(jì)算機(jī)編程架構(gòu)。
以下幾種編程語(yǔ)言都支持面向?qū)ο缶幊蹋?/p>
C++
Java
Objective-C
Smalltalk
C#
Ruby
面向?qū)ο筇卣?/h2>1) 封裝:指能夠把一個(gè)實(shí)體的信息、功能、響應(yīng)都裝入一個(gè)單獨(dú)的對(duì)象中的特性。
2) 繼承:繼承的方法允許在不改動(dòng)原程序的基礎(chǔ)上對(duì)其進(jìn)行擴(kuò)充,這樣使得原功能得以保存,而新功能也得以擴(kuò)展。這有利于減少重復(fù)編碼,提高軟件的開(kāi)發(fā)效率。
3) 多態(tài):同一操作作用于不同的對(duì)象,可以有不同的解釋?zhuān)a(chǎn)生不同的執(zhí)行結(jié)果。在運(yùn)行時(shí),可以通過(guò)指向基類(lèi)的指針,來(lái)調(diào)用實(shí)現(xiàn)派生類(lèi)中的方法。
4)抽象:抽象(Abstraction)是簡(jiǎn)化復(fù)雜的現(xiàn)實(shí)問(wèn)題的途徑,它可以為具體問(wèn)題找到最恰當(dāng)?shù)念?lèi)定義,并且可以在最恰當(dāng)?shù)睦^承級(jí)別解釋問(wèn)題。
Lua 中面向?qū)ο?/h2>
1) 封裝:指能夠把一個(gè)實(shí)體的信息、功能、響應(yīng)都裝入一個(gè)單獨(dú)的對(duì)象中的特性。
2) 繼承:繼承的方法允許在不改動(dòng)原程序的基礎(chǔ)上對(duì)其進(jìn)行擴(kuò)充,這樣使得原功能得以保存,而新功能也得以擴(kuò)展。這有利于減少重復(fù)編碼,提高軟件的開(kāi)發(fā)效率。
3) 多態(tài):同一操作作用于不同的對(duì)象,可以有不同的解釋?zhuān)a(chǎn)生不同的執(zhí)行結(jié)果。在運(yùn)行時(shí),可以通過(guò)指向基類(lèi)的指針,來(lái)調(diào)用實(shí)現(xiàn)派生類(lèi)中的方法。
4)抽象:抽象(Abstraction)是簡(jiǎn)化復(fù)雜的現(xiàn)實(shí)問(wèn)題的途徑,它可以為具體問(wèn)題找到最恰當(dāng)?shù)念?lèi)定義,并且可以在最恰當(dāng)?shù)睦^承級(jí)別解釋問(wèn)題。
我們知道,對(duì)象由屬性和方法組成。LUA中最基本的結(jié)構(gòu)是table,所以需要用table來(lái)描述對(duì)象的屬性。
lua中的function可以用來(lái)表示方法。那么LUA中的類(lèi)可以通過(guò)table + function模擬出來(lái)。
至于繼承,可以通過(guò)metetable模擬出來(lái)(不推薦用,只模擬最基本的對(duì)象大部分時(shí)間夠用了)。
Lua中的表不僅在某種意義上是一種對(duì)象。像對(duì)象一樣,表也有狀態(tài)(成員變量);也有與對(duì)象的值獨(dú)立的本性,特別是擁有兩個(gè)不同值的對(duì)象(table)代表兩個(gè)不同的對(duì)象;一個(gè)對(duì)象在不同的時(shí)候也可以有不同的值,但他始終是一個(gè)對(duì)象;與對(duì)象類(lèi)似,表的生命周期與其由什么創(chuàng)建、在哪創(chuàng)建沒(méi)有關(guān)系。對(duì)象有他們的成員函數(shù),表也有:
Account = {balance = 0} function Account.withdraw (v) Account.balance = Account.balance - v end
這個(gè)定義創(chuàng)建了一個(gè)新的函數(shù),并且保存在Account對(duì)象的withdraw域內(nèi),下面我們可以這樣調(diào)用:
Account.withdraw(100.00)
一個(gè)簡(jiǎn)單實(shí)例
以下簡(jiǎn)單的類(lèi)包含了三個(gè)屬性: area, length 和 breadth,printArea方法用于打印計(jì)算結(jié)果:
-- Meta class Rectangle = {area = 0, length = 0, breadth = 0} -- 派生類(lèi)的方法 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 -- 派生類(lèi)的方法 printArea function Rectangle:printArea () print("矩形面積為 ",self.area) end
創(chuàng)建對(duì)象
創(chuàng)建對(duì)象是位類(lèi)的實(shí)例分配內(nèi)存的過(guò)程。每個(gè)類(lèi)都有屬于自己的內(nèi)存并共享公共數(shù)據(jù)。
r = Rectangle:new(nil,10,20)
訪問(wèn)屬性
我們可以使用點(diǎn)號(hào)(.)來(lái)訪問(wèn)類(lèi)的屬性:
print(r.length)
訪問(wèn)成員函數(shù)
我們可以使用冒號(hào)(:)來(lái)訪問(wèn)類(lèi)的屬性:
r:printArea()
內(nèi)存在對(duì)象初始化時(shí)分配。
完整實(shí)例
以下我們演示了 Lua 面向?qū)ο蟮耐暾麑?shí)例:
-- Meta class Shape = {area = 0} -- 基礎(chǔ)類(lèi)方法 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 -- 基礎(chǔ)類(lèi)方法 printArea function Shape:printArea () print("面積為 ",self.area) end -- 創(chuàng)建對(duì)象 myshape = Shape:new(nil,10) myshape:printArea()
執(zhí)行以上程序,輸出結(jié)果為:
面積為 100
Lua 繼承
繼承是指一個(gè)對(duì)象直接使用另一對(duì)象的屬性和方法??捎糜跀U(kuò)展基礎(chǔ)類(lèi)的屬性和方法。
以下演示了一個(gè)簡(jiǎn)單的繼承實(shí)例:
-- Meta class Shape = {area = 0} -- 基礎(chǔ)類(lèi)方法 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 -- 基礎(chǔ)類(lèi)方法 printArea function Shape:printArea () print("面積為 ",self.area) end
接下來(lái)的實(shí)例,Square 對(duì)象繼承了 Shape 類(lèi):
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
完整實(shí)例
以下實(shí)例我們繼承了一個(gè)簡(jiǎn)單的類(lèi),來(lái)擴(kuò)展派生類(lèi)的方法,派生類(lèi)中保留了繼承類(lèi)的成員變量和方法:
-- Meta class Shape = {area = 0} -- 基礎(chǔ)類(lèi)方法 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 -- 基礎(chǔ)類(lèi)方法 printArea function Shape:printArea () print("面積為 ",self.area) end -- 創(chuàng)建對(duì)象 myshape = Shape:new(nil,10) myshape:printArea() Square = Shape:new() -- 派生類(lèi)方法 new function Square:new (o,side) o = o or Shape:new(o,side) setmetatable(o, self) self.__index = self return o end -- 派生類(lèi)方法 printArea function Square:printArea () print("正方形面積為 ",self.area) end -- 創(chuàng)建對(duì)象 mysquare = Square:new(nil,10) mysquare:printArea() Rectangle = Shape:new() -- 派生類(lèi)方法 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 -- 派生類(lèi)方法 printArea function Rectangle:printArea () print("矩形面積為 ",self.area) end -- 創(chuàng)建對(duì)象 myrectangle = Rectangle:new(nil,10,20) myrectangle:printArea()
執(zhí)行以上代碼,輸出結(jié)果為:
面積為 100 正方形面積為 100 矩形面積為 200
函數(shù)重寫(xiě)
Lua 中我們可以重寫(xiě)基礎(chǔ)類(lèi)的函數(shù),在派生類(lèi)中定義自己的實(shí)現(xiàn)方式:
-- 派生類(lèi)方法 printArea function Square:printArea () print("正方形面積 ",self.area) end