動態

詳情 返回 返回

Lua面向對象編程之基礎結構table簡例 - 動態 詳情

面向對象編程

(Object Oriented Programming,OOP)是一種非常流行的計算機編程架構。

Lua中最基本的結構是table,所以需要用table來描述對象的屬性。

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

簡例:

-- Czhenya Lua 面向對象
-- 對於一個對象來説, 屬性 方法
--[[ 兩種定義函數的方式
person.eat = function()
  print(person.name.."在寫LUA")
end
function person.eat()
  print(person.name.."在寫LUA")
end
--]]
--作為原型
Person = {name = 'Czhena',age = 22}
function Person:eat()
  print(self.name.."的年齡是"..self.age)
end
function Person:new(o)  -- 若o是空的則返回false
  local t = o or {}
  --[[ 和下面設置結果一樣,只是兩種不同的方式
  setmetatable{t,self}
  self.__index=self
  --]]
  setmetatable(t,{__index = self})  --設置元表
  --調用一個屬性的時候,如果t中不存在,就會在__index所指的table中查找
  return t
end
-- 類似於通過構造函數創建對象
person1 = Person:new({weight = 100})
person2 = Person:new()
print(person1.name)
print(person1.weight)
print(person2.name)
person1.name = "CZY"  --不會改變元表,添加到person.name
person1:eat()
person2:eat()
--繼承
Student = Person:new()
Student.grade = 1
stu1 = Student:new()
stu1:eat()
print(stu1.grade)

冒號和點定義函數的區別:

-- 使用冒號和點來的定義函數,建議用什麼定義函數,用什麼調用
person = {name="Czhenya",age=22}
function person:eat()
  print(self.name.."的年齡是"..self.age)
end
person.eat(person)
a = person
--冒號調用self自動賦值
a:eat()
--通過點來調用的時候,self不會自動賦值,必須通過參數傳遞
a.eat(a)

Add a new 評論

Some HTML is okay.