对lua继承中self.__index = self的释疑

首先看看从lua表中查找一个键时的流程:

-- 当从表t中查找键k时,lua处理如下:
-- 1.t中是否有k,有则直接返回值,否则第2步
-- 2.t是否有元表, 无则返回nil, 有则第3步
-- 3.t的元表是否有__index元方法, 无则返回nil, 有则查找__index指向的表或对应的方法

---注意两种写法
-- 写法1, 可以保持继承链
local class = {}

function class:new()
	self.__index = self
	return setmetatable( {}, self )
end

function class:say()
	print(111)
end

local o1 = class:new()
o1.say()

local o2 = o1:new()
o2.say()

--- 写法2, 只能继承1次, 第2次派生时没了__index元方法
local class = {}
class.__index = class

function class:new()
	return setmetatable( {}, self )
end

function class:say()
	print(111)
end

local o1 = class:new()
o1.say()

-- 第2次继承失败了, 因为o1并没有__index元方法
local o2 = o1:new()
o2.say()

  

时间: 2024-12-28 23:02:08

对lua继承中self.__index = self的释疑的相关文章

Lua语言中的__index,__newindex,rawget和rawset

转自:http://blog.csdn.net/wangbin_jxust/article/details/12108189 在谈及Lua中的__index,__newindex,rawget和rawset前,需要理解Lua中的元表这个概念. 零.元表的概念 对Lua中元表的解释: 元表可以改变表的行为模式. 这里举个例子: Window = {} Window.prototype = {x = 0 ,y = 0 ,width = 100 ,height = 100,} Window.mt =

跟我一起了解Lua语言中的_index,newindex,rawget和rawset

前言:理解Lua语言中的__index, __newindex, rawget和 rawset 在谈及Lua中的__index, __newindex, rawget和rawset前,需要理解Lua中的元表这个概念. 一.元表的概念 对Lua中元表的解释: 元表可以改变表的行为模式. 这里举个例子: Window = {} Window.prototype = { x = 0 , y = 0 , width = 100 , height = 100, } Window.mt = {} funct

单继承与多继承中的虚函数表和虚函数指针

首先,我们了解一下何为单继承,何为多继承?? 单继承:一个子类只有一个直接父类. 多继承:一个子类有两个或多个直接父类. 单继承中的虚函数表分析: 示例程序: #include <iostream> using namespace std; typedef void(*FUNC)(); class Base { public: virtual void func1() { cout << "Base::func1()" << endl; } virt

继承中的自定义构造方法

1.继承中的自定义构造方法 不能在子类访问父类私有变量 @interface Person : NSObject @property int age; - (id)initWithAge:(int)age; @end @interface Student : Person @property NSString *name; - (id)initWithAge:(int)age andName:(NSString *)name; @end @implementation Student - (id

C++ 类的继承三(继承中的构造与析构)

//继承中的构造与析构 #include<iostream> using namespace std; /* 继承中的构造析构调用原则 1.子类对象在创建时会首先调用父类的构造函数 2.父类构造函数执行结束后,执行子类的构造函数 3.当父类的构造函数有参数时,需要在子类的初始化列表中显示调用 4.析构函数调用的先后顺序与构造函数相反 继承与其他类做成员变量混搭的情况下,构造和析构嗲用原则 1.先构造父类,在构造成员变量,最后构造自己 2.先析构自己,再析构成员变量,最后析构父类 */ clas

面向对象语言成员变量方法可见性在继承中的变化

最近做得的有点杂,接触到几种面向对象的语言,C#,C++,JAVA .在一个情景下,软件的框架已经写好了,我们要对其功能实现增加和修改,这种情况是经常发生的,那么在面向对象的程序设计中我们要怎么做呢.我们都知道面向对象语言有几个特点,多态,封装,继承,既然框架已经写好了,我们修改功能可以考虑用继承的方法去实现新的功能,那么这样做对原有的功能会有影响么?这就涉及到成员变量成员方法可见性在继承中的变化了. 首先,我们看C++ 派生类通过继承,将基类的成员作为自己的一部分,但不同的继承方式导致基类的成

【openresty】向lua代码中传递参数

前面介绍FormInputNginxModule模块时,明白了openresty如何获取post提交的数据. 然后,如果需要通过lua处理这些数据,需要把数据作为参数传递到lua中,lua获取了这些数据,又会将结果返回到nginx内,从而完成整个流程. 首先,有post请求: 1 var json = { 2 data: "Hello!" 3 }; 4 $.post( 5 'save', 6 json, 7 function(callback){ 8 alert(callback);

Python进阶-继承中的MRO与super

摘要本文讲述Python继承关系中如何通过super()调用"父类"方法,super(Type, CurrentClass)返回CurrentClass的MRO中Type的下一个类的代理:以及如何设计Python类以便正确初始化. 1. 单继承中父类方法调用 在继承中,调用父类方法是很有必要的.调用父类方法的场景有很多: 比如必须调用父类的构造方法__init__才能正确初始化父类实例属性,使得子类实例对象能够继承到父类实例对象的实例属性: 再如需要重写父类方法时,有时候没有必要完全摒

【转载】 C++多继承中重写不同基类中相同原型的虚函数

本篇随笔为转载,原文地址:C++多继承中重写不同基类中相同原型的虚函数. 在C++多继承体系当中,在派生类中可以重写不同基类中的虚函数.下面就是一个例子: class CBaseA { public: virtual void TestA(); }; class CBaseB { public: virtual void TestB(); }; class CDerived : public CBaseA, public CBaseB { public: virtual void TestA()