Lua學習----面向對象編程

1.類

再Lua中能夠使用表和函數實現面向對象,將函數和相關的數據放置放置於同一個表中就造成了對象。例如:數組

Measure = {width = 0, height = 0}

function Measure:setWifth(v)
  self.width = self.width + v 
end function Measure:setHeight(v) self.height = self.height + v end function Measure:getMeasure() print(self.width * self.height) end function Measure:new(o) o = o or {} setmetatable(o, {__index = self}) return o end local a = Measure:new() a:setHeight(100) a:setWifth(5) a:getMeasure()

 上面這段代碼"setmetatable(o, {__index = self})"這句話值得注意根據再元表一章的學習,咱們知道,這裏的setmetatable負責建立o表的原型,當o在本身的表內找不到相應的方法時,便會到__index所指定的Measure類型中去尋找。函數

2.繼承

繼承能夠用元表實現,它提供在父類中查找存在的方法和變量機制。學習

繼承分爲單繼承和多重繼承。spa

單繼承:對象

childMeasure = Measure:new()
function childMeasure:setHeight(v)
  self.height = self.height + v * 2 
end

function childMeasure:setWidth(v)
  self.width = self.width + v * 2 
end

local area = childMeasure:new()
area:setHeight(100)
area:setWidth(5)
area:getMeasure()

多重繼承:blog

在多重繼承中,咱們本身利用'__index'元方法定義恰當的訪問行爲。繼承

以下,定義__index:教程

local function  search  (k, plist)
  for i=1,  #plist do      --注意 ,教程裏面使用的是table.getn(plist),是有問題的,由於plist是一個table數組,並非一個table-table類型,因此使用table.getn會報錯,改爲求數組的長度就能夠了
    local v = plist[i][k]   --  try 'i'-th  superclass
    if  v then  return  v end 
  end 
end
function  createClass (...)
  local c = {}  --  new class
  args  = {...}
  setmetatable(c, {__index  = function  (self,  k)  
    return  search(k, args)
  end})
  c.__index = c 
  function  c:new (o) 
    o = o or  {}  
    setmetatable(o, c)
    return  o
  end 
  return  c
end

使用方法:get

Named = {}
function  Named:getname ()
  return  self.name
end
function  Named:setname (n)
  self.name = n
end

NameMeasure = createClass(Measure, Named)
mmm = NameMeasure:new{name = "fdfdsf"}
print(mmm:getname())
mmm:setHeight(60)
mmm:setWidth(5)
mmm:getMeasure()  

注意:多重繼承是有順序的,根據createClass參數的順序,若是兩個類中存在相同的方法或者數據,則優先使用第一個參數的方法和數據。這一點能夠從下面的代碼中看出:原型

local function  search  (k, plist)
  for i=1,  #plist do      --注意 ,教程裏面使用的是table.getn(plist),是有問題的,由於plist是一個table數組,並非一個table-table類型,因此使用table.getn會報錯,改爲求數組的長度就能夠了
    local v = plist[i][k]   --  try 'i'-th  superclass
    if  v then  return  v end 
  end 
end
相關文章
相關標籤/搜索