日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

lua--面向对象使用middleclass

發布時間:2025/3/14 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。