json解析 子类和父类同名属性如何赋值_果壳lua教程(第三集):如何实现类的继承...

f9caf57891dc86ca9b1f0c9f8bf8ae40.png

....没错,还是代码:

mini = {

VehicleBrand = "mini" , --品牌

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

Displacement = 1.5 , --排量

MaxSpeed = 200 , --最高时速

deformation = function() --变形技能

return "UFO"

end

}

miniX = {

Displacement = 2.0 , --排量

MaxSpeed = 300 , --最高时速

deformation = function() --变形技能

return "变形金刚"

end

}

setmetatable(miniX,mini)

mini._index = mini

print(miniX.VehicleBrand)

print(miniX.Engine)

print(miniX.Displacement)

print(miniX.MaxSpeed)

print(miniX.deformation())

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

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

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

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

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

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

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

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

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

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

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

方法就是:

deformation=function() --变形技能

return "UFO"

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.__index = mini

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

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

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

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

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

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

print(miniX.VehicleBrand)

print(miniX.Engine)

print(miniX.Displacement)

print(miniX.MaxSpeed)

print(miniX.deformation())

输出结果分别是:

mini

涡轮增压

2

300

变形金刚

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值