--lua開發測試工具 LuaStudio(v9.91) 需要註冊才能使用,免費使用30天(那裏有個幫助按鈕)
--下載地址http://www.luastudio.net/download.htm
print("------------------lua面對對象所需基礎知識---------------------")
--基礎知識 可參考https://www.cnblogs.com/blueberryzzz/p/8947446.html
--__index 如何理解
--調用table的一個不存在的索引時,
--會使用到元表的__index元方法,__index可以是一個函數也可是一個table。
--例子1
--作爲函數:
--將表和索引作爲參數傳入__index元方法,return一個返回值
local mt = {}
--第一個參數是表自己,第二個參數是調用的索引
mt.__index = function(t,key)
return "it is "..key
end
t = {1,2,3}
--輸出未定義的key索引,輸出爲nil
print(t.key)
setmetatable(t,mt)
--設置元表後輸出未定義的key索引,調用元表的__index函數,返回"it is key"輸出
print(t.key)
print("例子1結束")
--[[結果:
nil
it is key
--]]
--例子2
--作爲table:
--查找__index元方法表,若有該索引,則返回該索引對應的值,否則返回nil
local mt = {}
mt.__index = {key = "it is key"}
t = {1,2,3}
--輸出未定義的key索引,輸出爲nil
print(t.key)
setmetatable(t,mt)
--輸出表中未定義,但元表的__index中定義的key索引時,輸出__index中的key索引值"it is key"
print(t.key)
--輸出表中未定義,但元表的__index中也未定義的值時,輸出爲nil
print(t.key2)
print("例子2結束")
--[[結果:
nil
it is key
nil
--]]
print("------------------------面對對象---------------")
--面對對象創建類
--基本參考可查看 https://www.cnblogs.com/msxh/p/8469340.html
--創建類
--super指的是基類 classname指的是類名
function BaseClass(classname,super)
local self = {}
--此處可以做下安全判斷 對super進行判斷
--todo
--設置元表 以及構造函數
if super then
setmetatable(self,super) --將父類作爲自己的元表,以便調用父類的方法
self.super = super --存一下父類
else
self.ctor = function() end --保證第一次創建類有構造函數
end
--設置元表的__index
self.__index = self --設置元表的索引,想要模擬類的話這部操作很關鍵
self.classname = classname --存一下類名
--構造方法 --實例化一個類對象
function self:new(...)
local instance = setmetatable({},self)--自身找不到就會調用元表的__index
instance.class = self --存儲下所屬類
instance:ctor(...) --調用構造函數
return instance
end
return self
end
local Person = BaseClass("Person") --創建了一個類
function Person:ctor(b) --類的構造方法
print(b)
end
Person.Name = "hhhh" --類的字段
Person.Heigh = 180
local person = Person:new(1) --實例化類對象
person.Name = "hhhh22" --修改實例化類的字段
--解釋:讀取字段過程
--person指的是instance實例,但是實例本身是空table,所以
--會去找元表的__index(已經設置爲Person自身了),所以可以取到字段Name和Heigh
print(person.Name) --打印實例化類的字段
print(person.Heigh)
local Man = BaseClass("Man",Person) --實例化類並繼承自類Person
function Man:ctor(b)
print(b)
end
Man.Age = 1
local man = Man:new(333)
--解釋:讀取字段過程
--man指的是instance實例,但是實例本身是空table,所以
--會去找元表的__index(已經設置爲Man自身了),所以可以取到字段Age
--但是Man取不到字段Name和Heigh,所以又去找Man的元表Person的__index(Person)
--所以可以取到字段Name和Heigh
print(man.Name)
print(man.Heigh)
print(man.Age)
print("------------------------面對對象結束---------------")
--若是對您有所幫助,世界便多了一份你我的溫暖
--您的支持將是我的動力,手有餘糧的話,一點點讚賞我將開心不已(一毛錢也是極好的)
--若是對您有所幫助,世界便多了一份你我的溫暖
--您的支持將是我的動力,手有餘糧的話,一點點讚賞我將開心不已(一毛錢也是極好的)