当前位置: 首页 > news >正文

北京专业企业网站建设旅游网站建设维护

北京专业企业网站建设,旅游网站建设维护,一个域名可以建几个网站,保定seo博客文章目录 封装继承多态 封装 // 定义基类 Object {}//由于表的特性#xff0c;该句就相当于定义基类变量 Object.id 1//该句相当于定义方法#xff0c;Object可以视为定义的对象#xff0c;Test可以视为方法名 //我们知道Object是一个表#xff0c;但是抽象地看#xff… 文章目录 封装继承多态 封装 // 定义基类 Object {}//由于表的特性该句就相当于定义基类变量 Object.id 1//该句相当于定义方法Object可以视为定义的对象Test可以视为方法名 //我们知道Object是一个表但是抽象地看请把Object看着面向对象中的 “对象” function Object:Test()print(self.id) end // 以上语句等同于 // public class Object{int id1;void Test(Object obj)print(obj.id); }//定义一个new方法用于创建这个基类的对象 function Object:new()//定义空表obj,用面向对象比喻相当于new了一个空对象local obj {}//绑定元表将元表看作一个基类self.__index selfsetmetatable(obj, self)//返回空对象return obj endlocal Car Object:new() //实际是将new出的空对象return给外部定义的Car // 以上语句等同于 // Object Car new Object();// 由于Car实际上是空的table所以访问Car其实是通过__index访问基类中的索引 // 相当于虽然没有定义Car内的变量但初始化时继承基类的值作为了初始值 print(Car.id) --1来自元表// 同样的Car实际使用了__index基类提供的方法 // 但是由于入参是self此处就是Carprint(Car.id)最终还是访问了基类__index找到的Object.id Car:Test() --1来自元表// 定义Car中的变量 Car.id 2 // 现在Car表中有了索引id那么就能找到这个索引所以输出为2 Car:Test() --2来自子表现在我们可以像面向对象一样new一个对应基类的对象了。但是这里的new也不完全相似与面向对象的new例如我们可以这样做: Car.name a print(Car.name) 输出 a我们在封装Object类的时候可完全没有name这个索引而在Lua中我们new了一个新对象还能新加入一些变量和方法这些特性明显是继承了父类的子类才有的。算不上坏处不过我们想要完全实现封装还能加以限制 //定义一个垃圾列表将添加到子类的垃圾都丢进去 garbage{}//定义一个new方法用于创建这个基类的对象 function Object:new()//定义空表obj,用面向对象比喻相当于new了一个空对象local obj {}// 禁止子类的添加self.__newindex garbage//绑定元表将元表看作一个基类self.__index selfsetmetatable(obj, self)//返回空对象return obj end local Car Object:new() Car.name a print(Car.name)输出 nil现在我们确实实现封装了既能访问基类的方法和变量又能阻止新加的其他东西但是还得把垃圾及时清理这点我们将在后文垃圾回收中讲解。 继承 面向对象重要的特性之继承光new一个新对象无法满足全部需要我们想要重写父类的一些方法而非直接使用它们就需要继承。 观察上面的Object:new()代码其实我们如果想用进行继承其实只需要在上面改改即可 Object {} Object.id 1; function Object:Test()print(self.id) end//换种方式如果我们不return的话想要返回这个值可以直接把它丢进全局表中 function Object:subClass(className)_G[className] {}self.__index selfsetmetatable(_G[className], self) end Object:subClass(Cat) print(Cat.id) 输出 1继承比封装还要简单一点其实它和我们第一次定义的封装是一模一样的只是换了种方式来实现。 // new一个Cat类的对象 local WhiteCat Cat:new() print(WhiteCat.id) -- 1function Object:Test()print(我是基类) endfunction Object:new()local obj {}self.__newindex garbageself.__index selfsetmetatable(obj, self)return obj endfunction Object:subClass(className)_G[className] {}self.__index selfsetmetatable(_G[className], self) end//Cat继承基类 Object:subClass(Cat) //new一个Cat类的对象WhiteCat local WhiteCat Cat:new() WhiteCat:Test() -- 我是基类// 重写Test方法其实只是新写了一个放在Cat表里被调用更像重载 function Cat:Test()print(我是猫类) end WhiteCat:Test() --我是猫类//想要重写Cat的Test方法不好意思我已经用__newindex封装好了 //白猫是个对象而不是Cat这个类它不应该重写方法 //下面重写的方法会被丢到garbage里 function WhiteCat:Test()print(我是白猫) end WhiteCat:Test() --我是猫类 garbage:Test() --我是白猫如果看不明白建议重学Table元表以及面向对象 多态 多态就是对于一个父类的相同方法子类可以执行不同的逻辑。实现多态我们可以怎么做 重写和重载方法实现接口实现抽象类和抽象方法 如果重写应当是这样 function Object:Test()print(我是基类) end Object:subClass(Cat) Object:subClass(Dog) function Cat:Test()print(我是猫类) end function Dog:Test()print(我是狗) end重写固然可以实现问题在于继承了父类之后的重写是无法保留父类的同名方法的那我想要访问父类的方法怎么办 别忘了我们的类其实是个table我直接把父类存进去然后要使用的时候访问不就行了吗反正又没有面向对象语法限制。 function Object:subClass(className)_G[className] {}local obj _G[className]self.__index self// 直接把父类表存进子类的baseobj.base selfsetmetatable(obj , self) endfunction Dog:Test()print(我是狗) end Dog:Test() Dog.base:Test()输出 我是狗 我是基类function Dog:Test()// 如果想在继承了父类的方法的基础之上重写self.base:Test()print(我是狗) endDog:Test() --我是基类 我是狗注意如果我们直接用的父类方法在调用父类的时候应当避免不同的类共享全局变量 Object {} Object.id 1; function Object:Test()self.id self.id 1print(self.id) endObject:subClass(Cat) function Cat:Test()self.base:Test()print(我是猫类) end Object:subClass(Dog) function Dog:Test()self.base:Test()print(我是狗) end输出 2 我是猫类 3 我是狗原因也很简单table内存放了父类的table我们直接调用父类的Test方法那么self.id每次调用都会加一。两个table中的父类是同一个地址而Object:Test()这个方法中每次传入给self的都是这个xxx.base也就是这个父类table本身所以self.id增加的是父类中的id作为一个全局变量它自然是不断增加的。 那么我们想让子类既能在继承Object:Test()这个父类方法基础之上重写又想使得self.id改变的self是我们使用方法的那个子类table那么就应当这样写 Object {} Object.id 1; function Object:Test()self.id self.id 1print(self.id) endObject:subClass(Cat) function Cat:Test()// 手动地传入参数因为冒号传入给self的是base// 因此需要手动地改变传入的参数的值self.base.Test(self)print(我是猫类) end Cat:Test()输出: 2 我是猫类重载应该是最简单的多态方法只需要改变函数的入参数量就行了 至于接口和抽象类lua本身的函数就可以重写抽象性还是很强的。而接口我们应当可以访问另一个table结构来实现例如self.base应当就能视为一种接口当然这些只是我的想法目前还没学习到。
http://www.dnsts.com.cn/news/207164.html

相关文章:

  • 怎么挖掘网站的关键词wordpress 签到 排行
  • 销售类网站数据库的建设网站布局是什么
  • 香河建设局网站凤凰军事新闻最新消息
  • 外链查询网站知乎怎么申请关键词推广
  • 推广网站文案素材信息推广
  • 网站怎么做才有效果网站建设上传视频
  • 自己做的电影网站打开很慢网站已收录的404页面的查询
  • 公司网页网站建设ppt模板下载微客到分销系统
  • 兰州市建设厅网站丽水哪里做网站
  • 句容网站定制长沙找工作哪个网站好
  • 天堂中文在线百度网络优化
  • 北京制卡厂家做卡公司北京制卡网站_北京制卡_北京 去114网百度官方网站
  • 美食网站 源码网站顶部flash下载
  • 毕业生就业推荐表模板网站开发58推广网站建设有用吗
  • 合肥网站制作公司电话福布斯中国100名人榜
  • 做网站建设哪家便宜深圳品牌网站建设公司
  • 什么公司会招网站建设网站登陆注册怎么做
  • 雕塑网站模板河北网站建设排名
  • 2015个人备案网站论坛剪辑素材网站
  • 哪些网站专门做细胞的百度爱采购排名
  • 网站常用代码网站死链接怎么删除
  • 巴中市建设局新网站家装设计费用怎么收费
  • 网站建设的系统设计网站计划
  • 安丘网站建设绝对正品的购物app
  • 东莞网站快速排名优化简单的广告设计图片
  • 绿叶网站怎么做学生网站建设的总结与评价
  • 我要自学网网站温县住房和城乡建设局网站
  • 旅游网站开发选题背景如何查看一个网站用什么程序做的
  • 哪家房屋设计公司网站wordpress仿京东
  • 五网合一网站建设丹徒网站建设报价