本人刚从C++过来。所以继承方法尝试模拟c++的方法。不过遇到了问题。
比如我想实现连续的继承:D1继承C,D2继承C, C继承B,B继承A
/--- D1
A----B—C -
— D2
代码我写成下面这个样子:
----文件A.lua------
local A = class(“A”)
function A:ctor(id)
self.id = id
print(“初始化A”, id)
end
return A
----文件B.lua--------
local B = class(“B”, require “app.A”)
function B:ctor(id)
self.super:ctor(id)
print(“初始化B”, id)
end
return B
----文件C.lua--------
local C = class(“C”, require “app.B”)
----C类中没有ctor函数
return C
----文件D1.lua--------
local D1 = class(“D1”, require “app.C”)
function D1:ctor()
self.super:ctor(101)
print “初始化D1”
end
return D1
-----文件D2.lua-----------
local D2 = class(“D2”, require “app.C”)
function D2:ctor()
self.super:ctor(102)
print “初始化D2”
end
return D2
然后调用下面函数:
local D1 = require(“app.D1”)
local d1 = D1.new()
local D2 = require(“app.D2”)
local d2 = D2.new()
print(“d1 id为”, d1.id);
print(“d2 id为”, d2.id);
但是出现2个问题:
1.B的ctor会调用两次。我在网上查了一下,然后看了一下源代码,发现是因为C中没有ctor,直接C调用B的ctor,但是这个时候self变成了C,所以B的ctor会调用两次。我就只能改成
function B:ctor(id)
B.super:ctor(id)
print(“初始化B”, id)
end
其他ctor中也一样
但是这个是比较常用的lua中继承的写法吗?效率高不高?
2.最后输出的d1.id和d2.id都是102,也就是说d2把d1覆盖了。这个我查了一下,发现是因为require这个函数,如果引用同一个文件,只加载一次。也就是说D1和D2的父类都是共享同一个table。
于是我就只能使用粗暴的方法,加载之前先卸载:
package.loaded = nil
local D2 = class(“D2”, require “app.C”)
function D2:ctor()
self.super:ctor(102)
print “初始化D2”
end
这样子是行的。但是肯定不是很好的办法。所以想问问大家,正规的继承写法应该是什么样子的呢?
