Lua 面向?qū)ο?/h1>

面向?qū)ο缶幊蹋∣bject Oriented Programming,OOP)是一種非常流行的計(jì)算機(jī)編程架構(gòu)。

以下幾種編程語言都支持面向?qū)ο缶幊蹋?/p>

  • C++

  • Java

  • Objective-C

  • Smalltalk

  • C#

  • Ruby

面向?qū)ο筇卣?/h2>
  • 1) 封裝:指能夠把一個(gè)實(shí)體的信息、功能、響應(yīng)都裝入一個(gè)單獨(dú)的對象中的特性。

  • 2) 繼承:繼承的方法允許在不改動(dòng)原程序的基礎(chǔ)上對其進(jìn)行擴(kuò)充,這樣使得原功能得以保存,而新功能也得以擴(kuò)展。這有利于減少重復(fù)編碼,提高軟件的開發(fā)效率。

  • 3) 多態(tài):同一操作作用于不同的對象,可以有不同的解釋,產(chǎn)生不同的執(zhí)行結(jié)果。在運(yùn)行時(shí),可以通過指向基類的指針,來調(diào)用實(shí)現(xiàn)派生類中的方法。

  • 4)抽象:抽象(Abstraction)是簡化復(fù)雜的現(xiàn)實(shí)問題的途徑,它可以為具體問題找到最恰當(dāng)?shù)念惗x,并且可以在最恰當(dāng)?shù)睦^承級別解釋問題。

Lua 中面向?qū)ο?/h2>

我們知道,對象由屬性和方法組成。LUA中最基本的結(jié)構(gòu)是table,所以需要用table來描述對象的屬性。

lua 中的 function 可以用來表示方法。那么LUA中的類可以通過 table + function 模擬出來。

至于繼承,可以通過 metetable 模擬出來(不推薦用,只模擬最基本的對象大部分時(shí)間夠用了)。

Lua 中的表不僅在某種意義上是一種對象。像對象一樣,表也有狀態(tài)(成員變量);也有與對象的值獨(dú)立的本性,特別是擁有兩個(gè)不同值的對象(table)代表兩個(gè)不同的對象;一個(gè)對象在不同的時(shí)候也可以有不同的值,但他始終是一個(gè)對象;與對象類似,表的生命周期與其由什么創(chuàng)建、在哪創(chuàng)建沒有關(guān)系。對象有他們的成員函數(shù),表也有:

Account = {balance = 0}
function Account.withdraw (v)
    Account.balance = Account.balance - v
end

這個(gè)定義創(chuàng)建了一個(gè)新的函數(shù),并且保存在Account對象的withdraw域內(nèi),下面我們可以這樣調(diào)用:

Account.withdraw(100.00)

一個(gè)簡單示例

以下簡單的類包含了三個(gè)屬性: area, length 和 breadth,printArea方法用于打印計(jì)算結(jié)果:

-- 元類
Rectangle = {area = 0, length = 0, breadth = 0}

-- 派生類的方法 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

-- 派生類的方法 printArea
function Rectangle:printArea ()
  print("矩形面積為 ",self.area)
end

創(chuàng)建對象

創(chuàng)建對象是為類的示例分配內(nèi)存的過程。每個(gè)類都有屬于自己的內(nèi)存并共享公共數(shù)據(jù)。

r = Rectangle:new(nil,10,20)

訪問屬性

我們可以使用點(diǎn)號(.)來訪問類的屬性:

print(r.length)

訪問成員函數(shù)

我們可以使用冒號 : 來訪問類的成員函數(shù):

r:printArea()

內(nèi)存在對象初始化時(shí)分配。

完整示例

以下我們演示了 Lua 面向?qū)ο蟮耐暾纠?/p>

-- 元類
Shape = {area = 0}

-- 基礎(chǔ)類方法 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ǔ)類方法 printArea
function Shape:printArea ()
  print("面積為 ",self.area)
end

-- 創(chuàng)建對象
myshape = Shape:new(nil,10)

myshape:printArea()

執(zhí)行以上程序,輸出結(jié)果為:

面積為     100

Lua 繼承

繼承是指一個(gè)對象直接使用另一對象的屬性和方法??捎糜跀U(kuò)展基礎(chǔ)類的屬性和方法。

以下演示了一個(gè)簡單的繼承示例:

-- Meta class
Shape = {area = 0}
-- 基礎(chǔ)類方法 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ǔ)類方法 printArea
function Shape:printArea ()
  print("面積為 ",self.area)
end

接下來的示例,Square 對象繼承了 Shape 類:

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

完整示例

以下示例我們繼承了一個(gè)簡單的類,來擴(kuò)展派生類的方法,派生類中保留了繼承類的成員變量和方法:

-- Meta class
Shape = {area = 0}
-- 基礎(chǔ)類方法 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ǔ)類方法 printArea
function Shape:printArea ()
  print("面積為 ",self.area)
end

-- 創(chuàng)建對象
myshape = Shape:new(nil,10)
myshape:printArea()

Square = Shape:new()
-- 派生類方法 new
function Square:new (o,side)
  o = o or Shape:new(o,side)
  setmetatable(o, self)
  self.__index = self
  return o
end

-- 派生類方法 printArea
function Square:printArea ()
  print("正方形面積為 ",self.area)
end

-- 創(chuàng)建對象
mysquare = Square:new(nil,10)
mysquare:printArea()

Rectangle = Shape:new()
-- 派生類方法 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

-- 派生類方法 printArea
function Rectangle:printArea ()
  print("矩形面積為 ",self.area)
end

-- 創(chuàng)建對象
myrectangle = Rectangle:new(nil,10,20)
myrectangle:printArea()

執(zhí)行以上代碼,輸出結(jié)果為:

面積為     100
正方形面積為     100
矩形面積為     200

函數(shù)重寫

Lua 中我們可以重寫基礎(chǔ)類的函數(shù),在派生類中定義自己的實(shí)現(xiàn)方式:

-- 派生類方法 printArea
function Square:printArea ()
  print("正方形面積 ",self.area)
end
丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清