源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

Lua面向对象之多重继承、私密性详解

  • 时间:2021-02-24 18:26 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Lua面向对象之多重继承、私密性详解
在Lua中的多重继承和私密性可能用得比较少,也可能只是我个人用得比较少。 本来想偷懒不写这文章的,因为我今天刚买了个漂移板,连起步都还没学会啊,想多学一会。 咳咳,本着坚持不懈、负责到底的态度,我还是决定随便写几句~(小若:随便写几句是几吨意思啊?!) [b]1.多重继承之在多个类中查找一个字段[/b] 我发现这些高(shen)智(jing)商(bing)人群真的很厉害,这种技巧都能想到,很佩服。 其实多重继承没什么特别的,除非两个将要被继承的类有相同的函数名和属性,否则,处理起来很简单。   无非就是在多个table中查找某个字段而已,不简单吗?Lua里的继承就是在别人的table里查找自己不存在的字段罢了。 那么,单继承与多重继承的差别也在这里,一个是只查找一个table,另一个是查找两个或以上的table。 我们就先来看看如何从2个或多个table中查找某个字段,如下代码:
[url=http://www.1sucai.cn/article/55168.htm]http://www.1sucai.cn/article/55168.htm[/url] 7) 最后返回child,一切都完成了。 看似很复杂,其实还是对__index的应用而已。 我们赶紧来测试一下吧,如下代码:
[u]复制代码[/u] 代码如下:
    --一个精灵类     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函数。 输出结果如下:
[u]复制代码[/u] 代码如下:
[LUA-print] 谁跟你hello! [LUA-print] 别动,再动我就瞄不准了!
怎么样?很简单吧~ [b]3.类的私密性[/b] 这里来说一个和多重继承无关的技巧,那就是私密性。 对于Java、C++等语言,我们都很熟悉,public、private、protected等关键词。 这些关键词让封装成为了可能。   然后,Lua里是没有私密这种说法的,类也是一个table,table的所有字段都是可以调用的,并没有说哪些是公有的,哪些是私有的。 如果有某些函数和属性不希望被外部调用,那么,也可以,不过这种实现方式看起来很别扭:
[u]复制代码[/u] 代码如下:
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仅仅存放了一些字段,这些字段就是能够被外部直接调用的函数或者是属性。 来看看测试代码:
[u]复制代码[/u] 代码如下:
    local sp = createTSprite();     sp.hello();     sp.hi();
输出结果如下:
[u]复制代码[/u] 代码如下:
[LUA-print] hello: [LUA-print] myBus是我自己的函数,你不能直接调用 [LUA-print] hi: [LUA-print] myGame是我自己的函数,你不能直接调用
这样,我们创建的对象就只能使用hello、hi、setName函数。 而其他的name、myBus、myGame只能通过这几个能使用的函数去调用,而不能直接调用。 这样就能完成私密性了。   不过,我个人有点迷糊,因为这已经不太像一个类的样子了。 [b]4.结束[/b] 好了,关于面向对象的内容,暂时介绍到这里。 可能介绍的都比较基础,目的是为了巩固Lua基础。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部