前面我們寫出了一個簡單的類Student,但是我們發現,我們直接使用Student也可以調用對象方法,這裏和我們們學過的其它語言的面向對象還是有些出入的(比如C++,JAVA ,C# , 類名稱是無法調用對象的方法與屬性),所以這裏改造一下,讓類方法、類變量, 與 對象方法,對象變量 分離。
代碼如下:
-- 定義類型
Student = {};
-- 定義類型屬性(相當於靜態成員變量)
Student.objCount = 0;
-- 定義類方法(相當於靜態成員函數)
function Student:Count( )
print ("一共有".. self.objCount.."個對象!");
end
-- 定義構造函數
function Student:Create()
Student.objCount = Student.objCount + 1;
local instance = {};
setmetatable(instance, self.prototype); --關鍵,instance可訪問prototype的屬性,方法
return instance;
end
-- 定義類型的prototype , 這裏的prototype可以隨意命名,並非關鍵字
Student.prototype = {};
-- 設置prototype的__index元方法
Student.prototype.__index = Student.prototype;
-- 定義實例對象屬性
Student.prototype.name = "";
Student.prototype.age = 10;
-- 定義實例對象方法
function Student.prototype:Init( a , n)
self.age =a;
self.name =n
end
-- 定義打印方法(使用:)
function Student.prototype:Show()
print ( "姓名:"..self.name ,"年齡:"..self.age);
end
------------------------測試-------------------------------
local stu1 = Student:Create();
stu1:Init("張三",12) --使用:方式調用
stu1:Show()
local stu2 = Student:Create();
stu2.Init(stu2,"李四",16) -- 使用.方式調用
stu2.Show(stu2)
--模擬類的靜態變量、方法
print(Student.objCount)
Student:Count() --使用:方式調用
Student.Count(Student) -- 使用.方式調用
運行結果圖如下:
大家結合這張圖看: