Classes And Methods Example


Class and Methods implementation for Lua

After the initial euphoria of having discovered Lua, one of the greatest scripting languages ever, passed I started to play around with classes and methods. I looked at various implementations and found Christian Lindig's (lindig |at| cs.uni-sb.de) to be the neatest way. I noted, however, that there was room for improvement to make it more dummy proof. To Christian Lindig's code I added the ability to easily add class constructors without dealing with obj directly.

How to use INC_Class.lua

The following code shows an example of the class constructor and inheritance features. Notice how class cTiger inherits from cAnimal by :

cTiger = setclass("Tiger", cAnimal)

and notice that if you have a method for the class called 'init', the code will automatically execute when you call class:new()

Example code:

require("INC_Class.lua")
--===========================
cAnimal=setclass("Animal")
function cAnimal.methods:init(action, cutename) 
	self.superaction = action
	self.supercutename = cutename
end
--==========================
cTiger=setclass("Tiger", cAnimal)
function cTiger.methods:init(cutename) 
	self:init_super("HUNT (Tiger)", "Zoo Animal (Tiger)")
	self.action = "ROAR FOR ME!!"
	self.cutename = cutename
end
--==========================
Tiger1 = cAnimal:new("HUNT", "Zoo Animal")
Tiger2 = cTiger:new("Mr Grumpy")
Tiger3 = cTiger:new("Mr Hungry")
print("CLASSNAME FOR TIGER1 = ", Tiger1:classname()) 
print("CLASSNAME FOR TIGER2 = ", Tiger2:classname()) 
print("CLASSNAME FOR TIGER3 = ", Tiger3:classname()) 
print("===============")
print("SUPER ACTION",Tiger1.superaction)
print("SUPER CUTENAME",Tiger1.supercutename)
print("ACTION ",Tiger1.action)
print("CUTENAME",Tiger1.cutename)
print("===============")
print("SUPER ACTION",Tiger2.superaction)
print("SUPER CUTENAME",Tiger2.supercutename)
print("ACTION ",Tiger2.action)
print("CUTENAME",Tiger2.cutename)
print("===============")
print("SUPER ACTION",Tiger3.superaction)
print("SUPER CUTENAME",Tiger3.supercutename)
print("ACTION ",Tiger3.action)
print("CUTENAME",Tiger3.cutename)

Class Implementation

-----------------------------------------------------
---- SETCLASS CLONES THE BASIC OBJECT CLASS TO CREATE NEW CLASSES
-----------------------------------------------------
-- Supports INHERITANCE 
--
-- Sam 2004年5月17日 
-- Modified Code from Christian Lindig - lindig (at) cs.uni-sb.de
---------------------------------------------------------------
-- EVERYTHING INHERITS FROM THIS BASIC OBJECT CLASS
BaseObject = {
 super = nil,
 name = "Object",
 new =
 function(class)
 local obj = {class = class}
 local meta = {
 __index = function(self,key) return class.methods[key] end 
 } 
 setmetatable(obj,meta)
 return obj
 end,
 methods = {classname = function(self) return(self.class.name) end},
 data = {}
}
function setclass(name, super)
 if (super == nil) then
 super = BaseObject
 end
 local class = {
 super = super; 
 name = name; 
 new =
 function(self, ...) 
 local obj = super.new(self, "___CREATE_ONLY___");
 -- check if calling function init
 -- pass arguments into init function
 if (super.methods.init) then
 obj.init_super = super.methods.init
 end
	if (self.methods.init) then
 if (tostring(arg[1]) ~= "___CREATE_ONLY___") then
 obj.init = self.methods.init
 if obj.init then
 obj:init(unpack(arg))
 end
 end
	end
 return obj
 end, 
 methods = {}
 }
 
 -- if class slot unavailable, check super class
 -- if applied to argument, pass it to the class method new 
 setmetatable(class, {
 __index = function(self,key) return self.super[key] end,
 __call = function(self,...) return self.new(self,unpack(arg)) end 
 })
 -- if instance method unavailable, check method slot in super class 
 setmetatable(class.methods, {
 __index = function(self,key) return class.super.methods[key] end
 })
 return class
end 

dontspamme_sam_lie2000@yahoo.2004年5月17日

See Also


RecentChanges · preferences
edit · history
Last edited December 25, 2009 8:21 pm GMT (diff)

AltStyle によって変換されたページ (->オリジナル) /