Наследство Луа - PullRequest
       28

Наследство Луа

1 голос
/ 02 августа 2011

У меня есть два класса в Lua.

test1 = {test1Data = 123, id= {0,3}}
function test1:hello()
    print 'HELLO!'
end
function test1:new (inp)
    inp = inp or {}
    setmetatable(inp, self)
    self.__index = self
    return inp
end

test2 = {}
function test2:bye ()
    print 'BYE!'
end
function test2:create_inst( baseClass )
    local new_class = {}
    local class_mt = { __index = new_class }
    function new_class:create()
        local newinst = {}
        setmetatable( newinst, class_mt )
        return newinst
    end
    if baseClass then
        setmetatable( new_class, { __index = baseClass } )
    end

    return new_class
end

a = test1:new({passData='abc'})
print (a.test1Data, a.passData, a:hello())
c = test2:create_inst(a)
print (c.test1Data, c.passData,c:hello(), c:bye())

Я хочу наследовать test2 от test, но оставить в указанных test2 методах bye. Все работает, кроме bye:method. Как я могу решить эту проблему?

Ответы [ 3 ]

2 голосов
/ 03 августа 2011

Вы возвращаете пустую таблицу в test2:create_inst(), ни при каких условиях ничего не ссылается на test2, поэтому функция test2:bye() отсутствует в таблице, возвращенной test2:create_inst()

0 голосов
/ 14 апреля 2017

Я думаю, что ответ хочет реализовать Multi-Inheritance, чтобы new_class наследовал "test2" и "baseClass".

local function search(k, objlist)
    local i = 0
    local v
    while objlist[i] then
        v = objlist[i][k] 
        if v then return v end
    end
end

function class(...)
    local parents = (...)
    local object = {}
    function object:new(o)
        o = o or {}
        setmetatable(o, object)
        return o
    end
    object.__index = object
    setmetatable(object, 
        {__index=function(t, k)
        search(k, parents)    
    end})
    return object
end

c = class(a, test2)
print(c.test1Data, c.passData,c:hello(), c:bye())
0 голосов
/ 09 мая 2015

В вашем коде test2 фактически не имеет ничего общего с таблицей, которую вы создаете, эта таблица new_class, которую вы возвращаете из test2:create_inst, является новым экземпляром.Естественно, у него нет поля с именем bye.Простая модификация:

function test2:create_inst( baseClass )
    ...
    if baseClass then
        setmetatable( new_class, { __index = baseClass } )
    end
    ...

    function new_class:bye()
        print("bye!")
    end
    return new_class
end
...