鍍金池/ 教程/ C/ Lua面向?qū)ο?/span>
Lua邏輯運(yùn)算符
Lua其他運(yùn)算符
Lua協(xié)同程序
Lua break語(yǔ)句
Lua運(yùn)算符
Lua面向?qū)ο?/span>
Lua教程
Lua函數(shù)
Lua數(shù)據(jù)庫(kù)/MySQL操作
Lua關(guān)系運(yùn)算符
Lua錯(cuò)誤處理
Lua數(shù)據(jù)類型
Lua嵌套循環(huán)
Lua變量
Lua基本語(yǔ)法
Lua字符串
Lua for循環(huán)
Lua if語(yǔ)句嵌套
Lua運(yùn)算符優(yōu)先級(jí)
Lua Web編程
Lua while循環(huán)
Lua開發(fā)環(huán)境
Lua if...else語(yǔ)句
Lua標(biāo)準(zhǔn)庫(kù)
Lua游戲編程
Lua if語(yǔ)句
Lua算術(shù)運(yùn)算符
Lua表格
Lua決策
Lua文件I/O
Lua循環(huán)
Lua數(shù)組
Lua元表
Lua repeat...until循環(huán)
Lua迭代器
Lua調(diào)試
Lua模塊
Lua垃圾收集

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

面向?qū)ο缶幊?OOP),是指我們?cè)诰幊痰男聲r(shí)代中最常用的編程技術(shù)。有多種編程語(yǔ)言的支持OOP其包括:

  • C++

  • Java

  • Objective-C

  • Smalltalk

  • C#

  • Ruby

面向?qū)ο蟮奶匦?/h2>
  • 類: 類是可擴(kuò)展的模板用來(lái)創(chuàng)建對(duì)象,提供狀態(tài)的初始值(成員變量)和行為的實(shí)現(xiàn)。

  • 對(duì)象: 它是類的實(shí)例并具有分配給自己獨(dú)立的內(nèi)存。

  • 繼承: 它是由變量和類的函數(shù)被其他類繼承的概念。

  • 封裝: 它是將數(shù)據(jù)和函數(shù)相結(jié)合的一類內(nèi)的方法。數(shù)據(jù)可以在類的外部與函數(shù)的幫助下進(jìn)行訪問(wèn)。它也被稱為數(shù)據(jù)抽象。

Lua的OOP

在Lua中實(shí)現(xiàn)面向?qū)ο笈c表和Lua的第一類函數(shù)。通過(guò)將函數(shù)和相關(guān)數(shù)據(jù)插入表中形成一個(gè)對(duì)象。繼承可以在metatables的幫助下來(lái)實(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ì)算的面積。

-- 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)建對(duì)象

創(chuàng)建對(duì)象是類的實(shí)例分配存儲(chǔ)器的過(guò)程。每個(gè)對(duì)象具有它自己的存儲(chǔ)器和共享公用類數(shù)據(jù)。

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

訪問(wèn)屬性

在類中用點(diǎn) . 操作符,如下圖所示,可以訪問(wèn)屬性

print(r.length)

訪問(wèn)成員函數(shù)

使用冒號(hào)運(yùn)算符,如下圖所示,可以訪問(wèn)對(duì)象成員函數(shù)。

r:printArea()

存儲(chǔ)器被分配和初始值被設(shè)定。初始化過(guò)程可以比在其它面向?qū)ο蟮恼Z(yǔ)言構(gòu)造。它只是一項(xiàng)功能設(shè)定值,如上圖所示。

完整例子

讓我們來(lái)看看使用面向?qū)ο蟮腖ua中一個(gè)完整的例子。

-- 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)運(yùn)行上面的程序,會(huì)得到如下的輸出。

The area is 	100

Lua的繼承

繼承是擴(kuò)展形狀簡(jiǎn)單的基本對(duì)象,以矩形,正方形等的處理。它通常用于在真實(shí)世界中的共享和擴(kuò)展的基本性質(zhì)和功能。

讓我們看一個(gè)簡(jiǎn)單的類擴(kuò)展。有一個(gè)類,如下圖所示。

 -- 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

我們可以擴(kuò)展的形狀為正方形類如下所示。

Square = Shape:new上一篇:Lua調(diào)試下一篇:Lua標(biāo)準(zhǔn)庫(kù)