lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


hi, everyone :-)

now I made a OO style with lua, use a table of closure:

function object(i)
    local t = {}

    local i = i or 5
    function t:Foo()
        print("foo, i = ", i)
    end

    return t
end

now "i" is a true private data member in class object. only function Foo can "see" what i is,

but, when i use this tech to implement a control-contianer complement system, I have to put member data to the table: because I must let Control object and Container object all access the member data! in C++, we can do it with friend class, but I can not do this in lua:

function Control(parent)
    local t = {}
    ....
    local has_focus
    function t:SetFocus(focus)...end
    function t:HasFocus() return has_focus end


   ...
   return t
end

function Container(parent)
    local t = Control(parent) -- Container is-a Control

    local focus_child
    function t:SetFocusChild(child)...end
    function t:GetFocusChild() return focus_child end

    ...
    return t
end


Control().SetFocus can change the value of "has_focus", but SetFocusChild can't do that, it must use something to change the value of has_focus, and this thing must not call by user himself. (because these function e.g. SetRawFocus can not change "focus_child" value in Container, so it will break data), or I could put has_focus to public area(i.e. put it in table), but in this scene, anybody can change its value.

i just want a function SetFocus can change the value of focus_child, and a function SetFocusChild can change the value of has_focus. i.e. these two closure-variable are shared by two linked object.

has anybody have good idea to do this?