Lua面對對象

--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("------------------------面對對象結束---------------")
--若是對您有所幫助,世界便多了一份你我的溫暖
--您的支持將是我的動力,手有餘糧的話,一點點讚賞我將開心不已(一毛錢也是極好的)

--若是對您有所幫助,世界便多了一份你我的溫暖
--您的支持將是我的動力,手有餘糧的話,一點點讚賞我將開心不已(一毛錢也是極好的)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章