在C中,在堆中创建一个对象是这样的:A* c = new A(1); //堆中分配
而lua确切来说是没有对象的,lua只有table,可以当成类,而子类可以通过设置子类的元表和__index字段来实现继承。lua中子类的继承可否也这样写呢。只要稍作一点变化,完全是可以的。
一:基类与派生类实现,直接上源码:
1.基类
module(...,package.seeall)
name = "baseClass"
--创建一个class对象
function new(self, name)
local mt = {}
local newClass = {}
newClass.name = name
mt.__index = self
setmetatable(newClass, mt)
return newClass
end
function sayHello(self)
print("Hello! My Name is: " .. self.name)
end
说明一下:module好处多多,这里就不一一列举了,module最主要定义模块,不污染全局变量等等。...是requie传进来的模块名,package.seeall是对全局变量可见,否则连pirnt函数都无法使用。基类中有个属性name = "baseClass",有个方法sayHello,此方法就是输出self的name属性,self是通过外部调用传进来的。如果self没有name属性,而由于创建的子类是继承自基类class的,所以将会输出基类中的name字段,从而实现了继承功能。
2.以下是子类代码:
require("class")
local noNameObj = class:new()
noNameObj:sayHello() --由于创建时没有把名称name传给new,所以sayHello输出的是父类的名称baseClass
local logic = class:new("logic")
logic:sayHello()--输出的是自己的name,也就是logic
二:我要制作个逻辑基类,所有的逻辑类都从这个基类派生,而且每个逻辑类都是一个单例。同时由于创建不管这个逻辑类有没有,我一概通过Get函数去或者,如果存在,则返回此单例,如果不存在,则创建一个新的。以下是代码:
1.基类Logic继承自class
require("class")
module(...,package.seeall)
class = class:new()
function Get(self, classname)
if self[classname] then
return self[classname]
else
self[classname] = class:new(classname)
return self[classname]
end
end
2.以下是使用的测试例子,比如我要调用背包Bag类的一个属性
require("Logic")
local Bag = Logic:Get("Bag")
print(Bag.a)
Bag.a = 10
print(Bag.a)
local bag = Logic:Get("Bag")
print(bag.a)
三.我的Bag类是单独的一个模块,第一次调用时要通过require包含进来。
Bag.lua文件:
require("Logic")
module(...,package.seeall)
class = Logic.class.subclass(Logic)
function class:initialize()
end
function class:isBag()
print("true")
end
Logic.lua文件:
require("class")
module(...,package.seeall)
class = class:new()
function Get(self, classname)
if self[classname] then
return self[classname]
else
local obj = require(classname)
self[classname] = obj
return self[classname]
end
end