[url=http://www.1sucai.cn/article/55168.htm]http://www.1sucai.cn/article/55168.htm[/url]
7) 最后返回child,一切都完成了。
看似很复杂,其实还是对__index的应用而已。
我们赶紧来测试一下吧,如下代码:
--一个精灵类
TSprite = {}
function TSprite:hello()
print("谁跟你hello!");
end
function TSprite:new()
o = {}
setmetatable(o, self);
self.__index = self;
return o;
end
-- 一个子弹类
TBullet = {}
function TBullet:fire()
print("别动,再动我就瞄不准了!");
end
function TBullet:new()
o = {}
setmetatable(o, self);
self.__index = self;
return o;
end
-- 继承了两个类的子类
local BulletSprite = createClass(TSprite, TBullet);
-- 子类的对象
local bSprite = BulletSprite:new();
bSprite:hello();
bSprite:fire();
这里创建了两个类:TSprite和TBullet。
然后调用createClass函数,创建一个继承了TSprite和TBullet的子类。
最后创建子类的对象,调用对象的hello和fire函数。
输出结果如下:
[LUA-print] 谁跟你hello!
[LUA-print] 别动,再动我就瞄不准了!
怎么样?很简单吧~
[b]3.类的私密性[/b]
这里来说一个和多重继承无关的技巧,那就是私密性。
对于Java、C++等语言,我们都很熟悉,public、private、protected等关键词。
这些关键词让封装成为了可能。
然后,Lua里是没有私密这种说法的,类也是一个table,table的所有字段都是可以调用的,并没有说哪些是公有的,哪些是私有的。
如果有某些函数和属性不希望被外部调用,那么,也可以,不过这种实现方式看起来很别扭:
function createTSprite()
local self = {name = "benmutou"};
local function myBus()
print("myBus是我自己的函数,你不能直接调用");
end
local function myGame()
print("myGame是我自己的函数,你不能直接调用");
end
local function hello()
print("hello:");
myBus();
end
local function hi()
print("hi:");
myGame();
end
local function setName(newName)
self.name = newName;
end
return {hello = hello, hi = hi, setName = setName};
end
我们已经不需要用到冒号来定义函数了,这个类的name、myBus、myGame都是不希望给外部直接调用的。
调用createTSprite函数后,会返回一个新的table,这个table仅仅存放了一些字段,这些字段就是能够被外部直接调用的函数或者是属性。
来看看测试代码:
local sp = createTSprite();
sp.hello();
sp.hi();
输出结果如下:
[LUA-print] hello:
[LUA-print] myBus是我自己的函数,你不能直接调用
[LUA-print] hi:
[LUA-print] myGame是我自己的函数,你不能直接调用
这样,我们创建的对象就只能使用hello、hi、setName函数。
而其他的name、myBus、myGame只能通过这几个能使用的函数去调用,而不能直接调用。
这样就能完成私密性了。
不过,我个人有点迷糊,因为这已经不太像一个类的样子了。
[b]4.结束[/b]
好了,关于面向对象的内容,暂时介绍到这里。
可能介绍的都比较基础,目的是为了巩固Lua基础。