基础类(1)

来源:互联网 发布:淘宝模板怎么用 编辑:程序博客网 时间:2024/06/07 17:36

在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

 

0 0