• 新浪微博:
  • 微信 :
按键精灵电脑版
立即下载

软件版本:2014.06
软件大小:22.9M
更新时间:03-18

按键精灵安卓版
立即下载

软件版本:3.3.8
软件大小:62.5M
更新时间:12-18

按键精灵iOS版
立即下载

软件版本:1.7.1
软件大小:29.2M
更新时间:06-22

最新企业版UiBot
立即下载

软件版本:3.3
软件大小:282M
更新时间:08-06

快捷导航

登录 后使用快捷导航
没有帐号? 注册

登录 注册
发新话题 回复该主题

果壳lua教程(第三集):如何实现类的继承 [复制链接]

1#

  1. mini = {

  2. VehicleBrand = "mini" , --品牌

  3. Engine = "涡轮增压" , --发动机

  4. Displacement = 1.5 , --排量

  5. MaxSpeed = 200 , --最高时速

  6. deformation = function() --变形技能

  7. return "UFO"

  8. end

  9. }

  10. miniX = {

  11. Displacement = 2.0 , --排量

  12. MaxSpeed = 300 , --最高时速

  13. deformation = function() --变形技能

  14. return "变形金刚"

  15. end

  16. }

  17. setmetatable(miniX,mini)

  18. mini._idx = mini

  19. print(miniX.VehicleBrand)

  20. print(miniX.Engine)

  21. print(miniX.Displacement)

  22. print(miniX.MaxSpeed)

  23. print(miniX.deformation())
复制代码






小茗同学,今天我们来讲lua面向对象系列课程之---如何实现类的继承!


小茗同学:什么叫继承,是不是像儿子继承他爹的遗产那样?


差不多是这样,但是说得更科学点,应该是儿子继承了他爹的一些特征,并且在这些继承过来的特征基础上,儿子还新增了一些自己特有的特征。


小茗同学:这是不是就叫做"个性"?


是的,每个人都拥有只属于自己的个性,程序世界就是对现实世界的模仿,特别是面向对象这种概念,更是对现实世界的高度模仿。


小茗同学:那么老湿,我们来讲解代码吧!


好的,首先我们建立了一个表,我们可以把这个表理解为一个类,类名是一款著名的车子品牌:mini


接下来,我们来看下这个mini类里边包含了哪些内容


它包含了4个成员数据和一个方法


这4个成员数据分别用4个变量名来声明,并且在声明变量的同时已经给对应的变量赋值。


小茗同学:那么哪个是方法呢?


方法就是:

  1. deformation=function() --变形技能

  2. return "UFO"

  3. end
复制代码


>我们在表中有看到关键字function,说明这是个方法,其方法名是deformation,其方法内容是:返回"UFO",象征着启动了这辆车的变形功能


小茗同学:哇,这辆车能变成UFO?


是的,虽然看起来有些科幻,但请记住:今日之科幻,便是明日之现实!人类的发展史就是不断将科幻变为现实的历史,这是一种科学史观。


小茗同学:那么可不可以这么理解,成员数据就是指在表中声明的普通变量,而成员方法就是指在表中定义的函数?


是的没错!所以成员数据又可以称之为成员变量,方法又可以称之为成员函数


小茗同学:那么它们的用途是什么呢?


它们的用途取决于你怎么使用它。我们知道,面向对象只是一种概念、一种思想或思维方式,通过类的建立,将所有与之相关的数据和行为都集中在一起,换句话说:类是该类所有数据或行为的集合,数据通过变量来存储,行为通过方法(函数)来实现。这就像一辆汽车,它有品牌、有发动机、有排量等数据,也有驾驶、倒车、开启雨刷、开启车灯、和响喇叭等行为。


小茗同学:那么在本例中,这辆mini的唯一行为就是可以变形为UFO飞船咯?


是的小茗!为了加深对方法的理解,必须下猛料,我们知道大脑对于神秘的、具有强烈画面感的刺激物,最容易形成牢固记忆!所以采用变形UFO的行为,让大伙都能在脑海中幻化出一个UFO,它由mini汽车所变!有没有感觉很神奇!


不茗同学:哇噢,那么现在就让我们通过代码来实现这一神奇吧!


好!但是在此之前,我们还需要再造一辆更牛B的车(我们在以前的教程里有说过,你们皆是自己所编写的程序世界里的上帝),它能变身为变形金刚!


我们给这辆牛B车命名为miniX的车,可以将它理解为子类(注意,它也属于mini品牌哟)


小茗同学:老师插播一下,那么前面所说的mini是不是就是父类?


是的没错!并且,子类继承于父类!


小茗同学:如何实现继承?


问得好!但是在回答这个问题之前,我们先看看miniX这个子类里边,包含了什么内容。注意看,子类miniX里边只有排量、最高时速这两个成员数据,以及变形技能这一方法。


小茗同学:我知道了,因为miniX可以继承于他爹类里的品牌名称和发动机类型,并且子类miniX的品牌与发动机正好和他爹完全一致,所以只需继承过来即可,无需再重新定义!


没错小茗,儿子和他爹相同的”特性“(无论是指成员数据还是指方法)只需要直接继承过来就行!另外,如果儿子想发展出自己不同的"个性"(例如本例中的miniX拥有不同于mini的排量值和最高时速值,以及独特的变形金刚技能),那么只需在儿子类中再次定义这一变量或方法,并给变量赋予不同的值、给方法赋予不同的内容,即可将原父类的同名变量或同名方法给覆盖掉!


小茗同学:OK,现在父类mini和子类miniX都建立了,接下来呢?


接下来,我们就要通过setmetatable(miniX, mini) 这段代码,将子类miniX与父类绑定,让子类承继于父类,这个过程我们可以通过一个带劲的画面来帮助大脑去理解:就像师傅传功给徒弟……


小茗同学:俗话说一日为师,终身为父,把师傅比喻为父亲,把徒弟比喻为儿子,也是行得通的!


是的小茗,记住,如何更好的帮助自己去理解,就如何去发挥想像,无论怎样天马行空,切勿让思维的油灯枯竭!


好,言归正传,我们前面已用setmetatable函数来实现了子类与父类的绑定,那么接下看这一段代码mini.__idx = mini


小茗同学:咦,这一段代码是啥意思,完全蒙圈了……


这段代码可以这样理解,首先mini.__idx表示定义父类mini的__idx方法(元方法),这个元方法的用意是什么呢?就是当mini的子类miniX访问不到自己的成员数据或成员方法时,就会调用它的父类的变量或方法。比如本例中的子类没有品牌这一变量,那么如果如此调用print(miniX.VehicleBrand),就会输出mini,因为miniX属于mini品牌,就像iphone8、iphoneX皆属于苹果品牌那样。


小茗同学:那假如miniX中有与他爹类中的“排量”这个同名变量,但变量的值并不一样,那么miniX中定义的新值将会覆盖父类中排量变量的旧值咯?


是的,并且在miniX类中还可以创建一个新的(连他爹都没有的)变量或方法。


小茗同学:哇噢,听起来好酷炫的样子!


那么最终我们通过以下输出,将miniX中的所有成员变量的值以及它的方法的返回值都输出了出来:





  1. print(miniX.VehicleBrand)

  2. print(miniX.Engine)

  3. print(miniX.Displacement)

  4. print(miniX.MaxSpeed)

  5. print(miniX.deformation())
复制代码
输出结果分别是:


mini

涡轮增压

2

300

变形金刚

最后编辑果壳王子 最后编辑于 2020-03-31 22:39:24
本主题由 按键合作伙伴 果壳王子 于 2020/3/31 22:38:45 执行 设置高亮 操作
果壳学院 ● 疯狂编程 QQ交流群: 327610461 (编程要从娃娃抓起)

  果壳热编程教育网:www.guokeHOT.com ←点击登录,即刻学习!

发新话题 回复该主题