2014-10-21 5 views
2

Я довольно новичок в Lua, и я пытаюсь заставить классную систему работать. То, что я хотел бы сделать это, чтобы иметь базовый класс, который имеет кучу свойств, а затем расширить этот класс для объектов, таких как кнопки, текстовые поля и т.д.Функция переопределения наследования Lua

Базовый класс будет иметь свойства, такие как x, y, width , height и т. Д., А затем другие классы будут иметь, скажем, label или colour или аналогичные.

Если я создаю функцию, такую ​​как render() в базовом классе, и позже попытаюсь переопределить эту функцию, она не работает. (! Предположительно, я использую классы совершенно неправильно)

Вот репродукция вниз пример того, что я использую:

Base = {} 
Base.__index = Base 
function Base.create(value) 
    local b = {} 
    setmetatable(b, Base) 
    b.value = value 
    return b 
end 

function Base:render() 
    print("I'm the base! : "..self.value) 
end 

Button = {} 
Button.__index = Base 

function Button.create(value) 
    local b = Base.create(value) 
    setmetatable(b, Button) 
    return b 
end 

function Button:render() 
    print("I'm a button! : "..self.value) 
end 

Button.create("TestBtn"):render() 

Что я хотел бы сделать, это Button.create("TestBtn"):render() для печати I'm a button! : TestBtn однако он печатает I'm the base! : TestBtn.

Может ли кто-нибудь помочь мне переопределить функцию render с этим новым?

Спасибо, воля.

+0

'Button .__ index = Base' неверен. Обратите внимание, что это то же самое, что и «Base .__ index = Base» –

+0

@Etan Okay. Я подумал, что именно так наследовала магия. Итак, что мне не хватает или что-то не так? –

+1

Ну, я думаю, что я был немного крут. Это верно для привязки кнопки «Button» к «Base». Проблема в том, что вы не используете 'Button' себя как' __index' ни на чем. Вам нужно 'setmetatable (b, {__index = Button})' в 'Button.create', я считаю. Извини за это. –

ответ

1

Недостаток детали, как упоминалось в @siffiejoe, и я намекнул, заключается в том, что, как написано, ваши Button объекты не знают, чтобы посмотреть таблицу Button для методов.

Мое решение создало таблицы для мусора, чтобы создать эту ассоциацию, и на самом деле это не лучшее решение, но проиллюстрировало точку.

@ Ответ siffiejoe лучше в том, что он более точно кодирует желаемую функциональность и отношения. Затем также требуется дополнительный этап объединения таблиц «класс» (т. Е. setmetatable(Button, Base)).

Ключом здесь является работа метаметода index. Это описано с кодом в lua Reference Manual:

"index": The indexing access table[key]. 

function gettable_event (table, key) 
    local h 
    if type(table) == "table" then 
    local v = rawget(table, key) 
    if v ~= nil then return v end 
    h = metatable(table).__index 
    if h == nil then return nil end 
    else 
    h = metatable(table).__index 
    if h == nil then 
     error(···) 
    end 
    end 
    if type(h) == "function" then 
    return (h(table, key))  -- call the handler 
    else return h[key]   -- or repeat operation on it 
    end 
end 
0

Определить Button:render вместо Button:test.

+0

Спасибо за ваш ответ. Это было довольно глупо со мной! Однако, по-прежнему, похоже, выполняется Base: render(): codepad.org/AfODqE9J –

Смежные вопросы