鍍金池/ 教程/ Java/ 面向?qū)ο?/span>
數(shù)據(jù)庫訪問
循環(huán)
數(shù)組
錯(cuò)誤處理
面向?qū)ο?/span>
調(diào)試
游戲開發(fā)
文件 I/O
變量
迭代器
Web 編程
模塊
函數(shù)
元表
協(xié)程
垃圾回收機(jī)制
標(biāo)準(zhǔn)庫
決策
數(shù)據(jù)類型
運(yùn)行環(huán)境
操作符
字符串
基本語法
概述

面向?qū)ο?/h1>

面向?qū)ο蟾攀?/h2>

面向?qū)ο缶幊碳夹g(shù)是目前最常用的編程技術(shù)之一。目前大量的編程語言都支持面向?qū)ο蟮奶匦裕?

  • C++
  • Java
  • Objective-C
  • Smalltalk
  • C#
  • Ruby

面向?qū)ο蟮奶卣?/h2>

-類(class):類是可以創(chuàng)建對(duì)象,并為狀態(tài)(成員變量)提供初值及行為實(shí)現(xiàn)的可擴(kuò)展模板。 -對(duì)象(objects):對(duì)象是類的實(shí)例,每個(gè)對(duì)象都有獨(dú)立的內(nèi)存區(qū)域。 -繼承(inheritance):繼承用于描述一個(gè)類的變量和函數(shù)被另一個(gè)類繼承的行為。 -封裝(encapsulation):封裝是指將數(shù)據(jù)和函數(shù)組織在一個(gè)類中。外部可以通過類的方法訪問內(nèi)中的數(shù)據(jù)。封裝也被稱之為數(shù)據(jù)抽象。

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

在 Lua 中,我們可以使用表和函數(shù)實(shí)現(xiàn)面向?qū)ο蟆⒑瘮?shù)和相關(guān)的數(shù)據(jù)放置于同一個(gè)表中就形成了一個(gè)對(duì)象。繼承可以用元表實(shí)現(xiàn),它提供了在父類中查找存在的方法和變量的機(jī)制。
Lua 中的表擁有對(duì)象的特征,比如狀態(tài)和獨(dú)立于其值的標(biāo)識(shí)。兩個(gè)有相同值的對(duì)象(表)是兩個(gè)不同的對(duì)象,但是一個(gè)對(duì)象在不同的時(shí)間可以擁有不同的值。與對(duì)象一樣,表擁有獨(dú)立于其創(chuàng)建者和創(chuàng)建位置的生命周期。

一個(gè)真實(shí)世界的例子

面向?qū)ο笠呀?jīng)是一個(gè)廣泛使用的概念,但是你需要正確清楚地理解它。
讓我們看一個(gè)數(shù)學(xué)方面的例子。我們經(jīng)常需要處理各種形狀,比如圓、矩形、正方形。
這些形狀有一個(gè)共同的特征——面積。所以,所有其它的形狀都可以從有一個(gè)公共特征——面積的基類擴(kuò)展而來。每個(gè)對(duì)象都可以有它自己的特征和函數(shù),比如矩陣有屬性長、寬和面積,printArea 和 calculateArea 方法。

創(chuàng)建一個(gè)簡單的類

下面例子實(shí)現(xiàn)了矩陣類的三個(gè)屬性:面積、長和寬。它還同時(shí)實(shí)現(xiàn)了輸出面積的函數(shù) printArea。

-- 元類
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("The area of Rectangle is ",self.area)
end

創(chuàng)建對(duì)象

創(chuàng)建對(duì)象即是為類的實(shí)例分配內(nèi)存空間的過程。每個(gè)對(duì)象都有自己獨(dú)立的內(nèi)存區(qū)域,同時(shí)還會(huì)共享類的數(shù)據(jù)。

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

訪問屬性

我們可以使用點(diǎn)操作符訪問類中屬性。

print(r.length)

訪問成員方法

使用冒號(hào)操作符可以訪問對(duì)象的成員方法,如下所示:

r:printArea()

初始化階段,調(diào)用函數(shù)為對(duì)象分配內(nèi)存同時(shí)設(shè)置初值。這與其它與面向?qū)ο蟮恼Z言中的構(gòu)造器很相似。其實(shí),構(gòu)造器本身也就和上面的初始化代碼一樣,并沒有什么特別之處。

完整的例子

讓我們一起看一個(gè) Lua 實(shí)現(xiàn)面向?qū)ο蟮耐暾印?

-- 元類
Shape = {area = 0}

-- 基類方法 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

-- 基類方法 printArea
function Shape:printArea ()
  print("The area is ",self.area)
end

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

myshape:printArea()

運(yùn)行上面的程序,我們可以得到如下的輸出結(jié)果:

The area is     100

Lua 中的繼承

繼承就是從基對(duì)象擴(kuò)展的過程,正如從圖形擴(kuò)展至矩形、正方形等等。在現(xiàn)實(shí)世界中,常用來共享或擴(kuò)展某些共同的屬性和方法。
讓我們看一個(gè)簡單的類擴(kuò)展的例子。我們有如下的類:

 -- 元類
Shape = {area = 0}
-- 基類方法 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
-- 基類方法 printArea
function Shape:printArea ()
  print("The area is ",self.area)
end

我們從上面的類中擴(kuò)展出正方形類,如下所示:

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

重寫基類的函數(shù)

繼承類可以重寫基類的方法,從而根據(jù)自己的實(shí)際情況實(shí)現(xiàn)功能。示例代碼如下所示:

-- 繼承方法 printArea
function Square:printArea ()
  print("The area of square is ",self.area)
end

繼承的完整示例

在元表的幫助下,我們可以使用新的 new 方法實(shí)現(xiàn)類的擴(kuò)展(繼承)。子類中保存了所有基類的成員變量和方法。

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

運(yùn)行上面的程序,我們可以得到如下的輸出結(jié)果:

The area is     100
The area of square is   100
The area of Rectangle is    200

上面的例子中,我們繼承基類 Shape 創(chuàng)建了兩個(gè)子類 Rectange 與 Square。在子類中可以重寫基類提供的方法。在這個(gè)例子中,子類重寫了 printArea 方法。

上一篇:迭代器