Lua实验室(一):类的实现和理解

1. 环境 tolua U3D下。

2. 原理:lua中提供了metatable 元表的概念,这个相当于一个字典一样,使用Key-value的访问方式。其中有一些lua中实现的表操作可以用于支持面向对象的概念。表的__index 方法:当访问一个表不存在的域时,会触发lua解释器去查找__index metamethod,如果不存在,返回结果为nil,如果存在则由__index metamethod返回结果。特别的,如果是一张表,那么Lua将在这张表中查看是否有缺少的域。

pt = {}
local mt = {
	__index = function (ta,k)
		print("access to element mt")
	end,

	__newindex = function ( ta,k,v)
		print("update of element")
	end
}

setmetatable(pt,mt)

print(pt[2])

结果是access to element  mt和nil 说明pt找不到会去寻找元表的__index方法,而非自己的__index

tb1 = {}
tb2 = {
a = 2
}
tb2.__index = tb2
setmetatable(tb1,tb2)
print(tb1.a)
这个打印结果是2 ,而如果没有tb2.__index = tb2那么打印结果是nil,说明了 元表必须要有__index 指定,否则,子表找不到的域也不会去找元表的域的。

3.__newindex 

tb1 = {}

tb2 = {}

tb2.a = 2

tb2.__newindex = function ( ta,k,v)
		print("update of element tb2")
		tb2[k] = v
	end

tb2.__index = tb2
setmetatable(tb1,tb2)
tb1.a = 3
print(tb1.a)
的结果是update of element tb2 new index  和3 说明了赋值操作也是查找元表的_newindex 自身的不找的。并且和index不同的是,如果赋值操作中,元表有__newindex却也找不到这个域,那么就会相当于元表新建一个域进行赋值。如果没有__newindex 那么是对子表新建一个域进行赋值而对元表无关。

4. 面向对象的几大特点(1) 抽象(2)继承(3)多态(4)封装

Lua中可以实现 

简单的封装可以受用使用双表的设计,一个负责实现,一个负责外部访问。可以达到属性和方法的访问限制:私有、公有等。

继承是指一个类可以获得另一个类的属性和方法。特点是它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展

多态,概念上来说

继承是子类使用父类的方法,而多态则是父类使用子类的方法。而更准确的判断标准是
技术上的区别是绑定时期,晚期绑定一定是多态。
下面这种使用方式也是继承所带来的:
Triangel tri = new Triangle();
println("Triangle is a type of sharp? " + tri.isSharp());

而这种方式则是多态:
Sharp sharp = new Rectangle();
println("My sharp has " + sharp.getSides() + " sides.");
注Rectangle 重载了getsides方法。所以 sharp.getSides()是父类sharp调用了子类rectangle的方法。
多态在实际上最多的是类似于 funA<T>() { Shape A = new T(). A.getSides()}。
 
实现上来说。
tb1 = {}
tb2 = {}
tb2.a = 2
tb2.__index = tb2
--tb2.__newindex = tb2
setmetatable(tb1,tb2)
tb1.a = 3
print(tb1.a)
print(tb2.a)
就可以实现了继承:继承了父类的属性和方法,并且拥有各自的生命周期(环境),修改子类不影响父类。即设置好元表和元表__index 方法,而不设置__newindex 即可。
关于多态。实际上由于lua是弱类型的,一个变量可以被赋值不同的数据类型,所以本身就可以实现了。
在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格。在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定。这个概念的名字来源于由James Whitcomb Riley提出的鸭子测试,“鸭子测试”可以这样表述:
“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”
在鸭子类型中,关注的不是对象的类型本身,而是它是如何使用的。例如,在不使用鸭子类型的语言中,我们可以编写一个函数,它接受一个类型为鸭的对象,并调用它的走和叫方法。在使用鸭子类型的语言中,这样的一个函数可以接受一个任意类型的对象,并调用它的走和叫方法。如果这些需要被调用的方法不存在,那么将引发一个运行时错误。任何拥有这样的正确的走和叫方法的对象都可被函数接受的这种行为引出了以上表述,这种决定类型的方式因此得名。

 
 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值