lua--面向对象使用middleclass
昨天本來還想寫一篇love2d之角色移動的,可是不知怎么回事,
我在一個類里有setXY(),在love.load()里調用了,可是居然沒
按我的預想坐標,而是直接顯示在了頂點.后來各種print,發現
確實是調用了,但就是不顯示,郁悶,只好作罷.
后來也想不出原因,于是又看了一下lua面向對象,想到以后可能
很多地方會用到類,便想找一個簡潔的lua面向對象的擴展.先推薦一個很好的lua博客,當lua語法不懂時,我常去翻閱.
到http://lua-users.org翻了一下,發現了一些面向對象的擴展,最終選擇
了middleclass.middle意為中等,表明其是中等規模的
面向對象實現(作者介紹的),官網為https://github.com/kikito/middleclass/
不到140行代碼就實現了,類,繼承,虛函數,私有變量等.(下面的示例已帶middleclass,可以不用下載)
作者也提到了沒有實現的有
- metaclasses?? 元類嗎?不知道
- classes are not Objects (instances are) 類的實例是Objects,而類不是
- simulating a ‘super’ keyword (for performance concerns) 因為效率,沒有模擬'super'關鍵字
根據作者的提示,簡單的看看middleclass源碼,發現在下面摘錄的片斷里第4步才setmetatable(),即在class的實例new()之后,
才把其綁定到Object上.(只是簡單的看了一下,不確定正否,希望漂過的高手指正)
--1步function class(name, super, ...)super = super or Objectreturn super:subclass(name, ...) end
--2步
function Object.static:subclass(name)
? assert(_classes[self], "Make sure that you are using 'Class:subclass' instead of 'Class.subclass'")
? assert(type(name) == "string", "You must provide a name(string) for your class")
? local subclass = _createClass(name, self)
? _setClassMetamethods(subclass)
? _setDefaultInitializeMethod(subclass, self)
? self.subclasses[subclass] = true
? self:subclassed(subclass)
? return subclass
end
--3步
function Object.static:new(...)
? local instance = self:allocate()
? instance:initialize(...)
? return instance
end
--4步
function Object.static:allocate()
? assert(_classes[self], "Make sure that you are using 'Class:allocate' instead of 'Class.allocate'")
? return setmetatable({ class = self }, self.__instanceDict)
end
下面我們來使用middleclass,看其帶來的方便之處(以下的內容來自官方文檔,
英語好的同學可以自己去看).只介紹類和繼承,其它的功能現在還用不上,等以后
再說.
test.lua
require 'middleclass' --聲明一個類,也可用class('Person', Object) 或Object:subclass('Person') middleclass的根類是Object Person = class('Person')--構造函數 function Person:initialize(name)self.name = name end function Person:speak()print('Hi, I am ' .. self.name ..'.') end--繼承或Person:subclass('AgedPerson') AgedPerson = class('AgedPerson', Person) --類變量 AgedPerson.static.ADULT_AGE = 18--注意在子類里要調用父類里的構造函數 function AgedPerson:initialize(name, age)Person.initialize(self, name) --注意在子類里要調用父類里的構造函數self.age = age end--覆蓋子類里的方法,感覺確實像從c++里的虛函數 function AgedPerson:speak()Person.speak(self)--可以實例里直接訪問類變量if(self.age < AgedPerson.ADULT_AGE) thenprint('I am a child.')elseprint('I am an adult.')end end--等價于AgedPerson('Billy the Kid', 13),new()隱含調用 local p1 = AgedPerson:new('Billy', 13) local p2 = AgedPerson:new('Luke', 21)p1:speak() print("----------------") p2:speak()代碼,已clone的直接git pull
git clone git://gitcafe.com/dwdcth/love2d-tutor.git
或git clone https://github.com/dwdcth/mylove2d-tutor-in-chinese.git
轉載于:https://www.cnblogs.com/xdao/archive/2012/12/27/lua-middleclass-intro.html
總結
以上是生活随笔為你收集整理的lua--面向对象使用middleclass的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mongodb空间查询之查询单位
- 下一篇: 筛法求素数加强版