lua奇怪的继承

Posted 宋萌萌萌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lua奇怪的继承相关的知识,希望对你有一定的参考价值。

   lua中__index作为一个特殊的指针,使lua拥有了面向对象的能力。下面通过表A的对象表a调用test方法`a:test()`为例,简单回顾一下lua怎样进行方法查找:

前提:在创建a时会设置A为a的元表,且A.__index=A

1、若a中不存在test方法,则尝试访问其元表A的__index指向,即向表A查找

2、若A中也不存在test方法,则尝试访问A的元表的__index指向

   如果看了之前的文章应该知道__index是可以指向一个function的,于是,可以认为__index定义了查找方法,如果__index指向table则使用默认的查找方式,若__index指向function则相当于开发者自定义了查找方式,指向nil则相当于不允许向上查找。(强猜的,要想深耕还需要撸一波虚拟机源码)

   

   于是会发现,lua的面向对象实际是由元表关系构建起来的,而其中的__index则控制着成员变量和方法的查找方式(所谓的变量和方法,只不过都是表中的key-value键值对)。如果Student继承自Person,对象stu为一个Student实例,那么Student必为stu的元表,Person必为Student的元表。仔细看上面这句话,奇怪的事情发生了,stu相较于StudentStudent相较于Person之间有什么区别呢?答案当然是没区别!之所以这样以父类、子类和对象形容它们的关系,完全是基于在长期面向对象编程中的习惯叫法。

   于是可以这么理解:假设A是B的元表,如果把B当做实例使用,可称B为A的实例;若把B当作类来使用,可称B继承自A。事实上不管怎么称呼,它们都是lua table,就像Objective-C,所谓类和对象,本质上都是结构体而已。

   写在最后:苟利国家生死以 岂因祸福避趋之!什么阿迪耐克优衣库,匡威彪马新百伦,从此皆是陌路人!北美奴隶主种族灭绝匪帮必须被毁灭!

以上是关于lua奇怪的继承的主要内容,如果未能解决你的问题,请参考以下文章

lua如何继承unity类

Lua面向对象----类继承多继承单例的实现

lua实现多继承

lua 类继承和实现

Lua继承和方法

lua-table类的继承