请教一下关于继承的问题

本人刚从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

这样子是行的。但是肯定不是很好的办法。所以想问问大家,正规的继承写法应该是什么样子的呢?

--Test1.lua
local Test1 = class("Test1", function()
    local node = display.newNode()
    return node
end)            

Test1.__index      = Test1

function Test1:create()
    local ret = Test1.new()
    ret:init_()
    return ret
end

function Test1:init_()
    print("test1 init func")
end

function Test1:commonFunc()
    print("common func")
end

function Test1:myFunc()
    print("test1 func 1")
end

return Test1


--Test2.lua
local Test2 = class("Test2", function()
    local pTest1 = require("app.view.Test1"):create()
    return pTest1
end)            

Test2.__index      = Test2

function Test2:create()
    local ret = Test2.new()
    ret:init_()
    return ret
end

function Test2:init_()
    print("test2 init func")
end

function Test2:myFunc()
    print("test2 func 2")
end


return Test2


--测试
    local pTest1 = require("app.view.Test1"):create()

    pTest1:commonFunc()
    pTest1:myFunc()
    print('-------------')

    local pTest2 = require("app.view.Test2"):create()
    pTest2:commonFunc()
    pTest2:myFunc()


```