[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: Creating object simulate C++ object in lua
- From: Kenneth Gangstoe <kennethg@...>
- Date: Mon, 19 Aug 2002 09:30:33 +0200
Excellent response, Kelmar, but does anyone know if there are a preferred
way to do this in Lua 5.0?
- Kenneth
Quoting Kelmar K. Firesun (kfiresun@ix.netcom.com):
>
> ----- Original Message -----
> From: "nerurin" <nerurin@hotmail.com>
> To: "Multiple recipients of list" <lua-l@tecgraf.puc-rio.br>
> Sent: Thursday, August 15, 2002 3:00 PM
> Subject: Creating object simulate C++ object in lua
>
>
> > Hi all,
> >
> > I wonder what is the "easiest" way to create a class defination in
> > Lua, that function like C++ class. The intention is, I want to
> > prototype some idea, but I do not prefer to write in C++ right way.
> >
> > Thanks in advance!
> >
> >
>
> In 4.0 the easist way to do this is to set up an index tag
> method for your tables that will look for a super object inside
> of a table looking for properties/functions that were not found
> in the first table. The following is the code I use:
>
> function delegate(tab, item)
> local base = rawget(tab, "inherits")
> if type(base) == "table" then
> return base[item]
> else
> return nil
> end
> end
>
> settagmethod(tag{}, "index", delegate)
>
> Now, if the table "tab" has an item called "inherits" the tag
> method will check for that item, if found and it is a table, it
> will look for "item" in that table. This continues up the chain
> until the item is found or "inherits" isn't found.
>
> When you write your objects you create them as such:
>
> BaseObject = { myval = "A Value" }
>
> InheritedObject = { inherits = BaseObject, newval = "Another Value" }
>
> print(InheritedObject.myval)
>
> This will cuase the value "A Value" to be displayed. This
> functionally works great with functions as well. This following
> example shows how you might define a set of simplistic GUI objects:
>
> GUIObject =
> {
> x = 10,
> y = 10,
> Width = 100,
> Height = 100
> }
>
> function GUIObject:OnDraw()
> DrawRect(self.x, self.y, self.Width, self.Height)
> end
>
> function GUIObject:OnClick()
> -- Do something.
> print("GUIObject clicked!")
> end
>
> -- Then...
>
> StaticText =
> {
> inherits = GUIObject,
> Caption = "Static Text"
> }
>
> function StaticText:OnDraw()
> DrawText(self.x, self.y, self.Caption)
> end
>
> Now, when you call StaticText's OnDraw() method, you'll see the
> caption being displayed; however, the "x" and "y" values come from
> the inherited GUIObject class. Presumably the user wishing to
> create an instance of a StaticText object would override the "x"
> and "y" values to set the correct possition of the object.
>
> If you were to call StaticText's OnClick() method, the result
> would be that of the OnClick() defined in the GUIObject base class.
>
> The colon in the function definitions passes a hidden "self"
> parameter to the function. This is akin to the C++ "this" pointer.
>
> There are a few limitations to this setup:
>
> There are no private/protected methods and variables, everything
> can look inside the guts of your object and possibly play with the
> values.
>
> This is possibly not the most efficent way to do inheritance. I
> don't know of a better method inside of Lua though, I'd be
> intrested in hearing about other ways to do this.
>
> I hope this helps you out and that I explained it clearly enough.
>
> Kelmar K. Firesun (IRL: Bryce Simonds)
>
>