Lua面向對象寫Student類( 模擬類方法與對象方法)

前面我們寫出了一個簡單的類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) -- 使用.方式調用

運行結果圖如下:

大家結合這張圖看:

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