113 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Lua
		
	
			
		
		
	
	
			113 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Lua
		
	
-- class.lua
 | 
						|
-- Compatible with Lua 5.1 (not 5.0).
 | 
						|
function Class(base, _ctor)
 | 
						|
    local c = { }
 | 
						|
    return xClass(c, base, _ctor);
 | 
						|
end
 | 
						|
 | 
						|
function xClass(c, base, _ctor)
 | 
						|
    -- a new class instance
 | 
						|
    if not _ctor and type(base) == 'function' then
 | 
						|
        _ctor = base
 | 
						|
        base = nil
 | 
						|
    elseif type(base) == 'table' then
 | 
						|
        -- our new class is a shallow copy of the base class!
 | 
						|
        for i, v in pairs(base) do
 | 
						|
            c[i] = v
 | 
						|
        end
 | 
						|
        c._base = base
 | 
						|
    end
 | 
						|
 | 
						|
    -- the class will be the metatable for all its objects,
 | 
						|
    -- and they will look up their methods in it.clcl
 | 
						|
    c.__index = c
 | 
						|
 | 
						|
    -- expose a constructor which can be called by <classname>(<args>)
 | 
						|
    local mt = { }
 | 
						|
 | 
						|
    mt.__call = function(class_tbl, ...)
 | 
						|
        local obj = { }
 | 
						|
        setmetatable(obj, c)
 | 
						|
        if _ctor then
 | 
						|
            _ctor(obj, ...)
 | 
						|
        end
 | 
						|
        return obj
 | 
						|
    end
 | 
						|
 | 
						|
    c._ctor = _ctor
 | 
						|
    c.is_a = function(self, klass)
 | 
						|
        local m = getmetatable(self)
 | 
						|
        while m do
 | 
						|
            if m == klass then return true end
 | 
						|
            m = m._base
 | 
						|
        end
 | 
						|
        return false
 | 
						|
    end
 | 
						|
    setmetatable(c, mt)
 | 
						|
    return c
 | 
						|
end
 | 
						|
 | 
						|
function quick_class(classname, super)
 | 
						|
    local superType = type(super)
 | 
						|
    local cls
 | 
						|
 | 
						|
    if superType ~= "function" and superType ~= "table" then
 | 
						|
        superType = nil
 | 
						|
        super = nil
 | 
						|
    end
 | 
						|
 | 
						|
    if superType == "function" or (super and super.__ctype == 1) then
 | 
						|
        -- inherited from native C++ Object
 | 
						|
        cls = {}
 | 
						|
 | 
						|
        if superType == "table" then
 | 
						|
            -- copy fields from super
 | 
						|
            for k,v in pairs(super) do cls[k] = v end
 | 
						|
            cls.__create = super.__create
 | 
						|
            cls.super    = super
 | 
						|
        else
 | 
						|
            cls.__create = super
 | 
						|
            cls.ctor = function() end
 | 
						|
        end
 | 
						|
 | 
						|
        cls.__cname = classname
 | 
						|
        cls.__ctype = 1
 | 
						|
 | 
						|
        function cls.new(...)
 | 
						|
            local instance = cls.__create(...)
 | 
						|
            -- copy fields from class to native object
 | 
						|
            for k,v in pairs(cls) do instance[k] = v end
 | 
						|
            instance.class = cls
 | 
						|
            instance:ctor(...)
 | 
						|
            return instance
 | 
						|
        end
 | 
						|
 | 
						|
    else
 | 
						|
        -- inherited from Lua Object
 | 
						|
        if super then
 | 
						|
            cls = {}
 | 
						|
            setmetatable(cls, {__index = super})
 | 
						|
            cls.super = super
 | 
						|
        else
 | 
						|
            cls = {ctor = function() end}
 | 
						|
        end
 | 
						|
 | 
						|
        cls.__cname = classname
 | 
						|
        cls.__ctype = 2 -- lua
 | 
						|
        cls.__index = cls
 | 
						|
 | 
						|
        function cls.new(...)
 | 
						|
            local instance = setmetatable({}, cls)
 | 
						|
            instance.class = cls
 | 
						|
            instance:ctor(...)
 | 
						|
            return instance
 | 
						|
        end
 | 
						|
        --扩展create方法
 | 
						|
        function cls.create(...)
 | 
						|
            return cls.new(...)
 | 
						|
        end
 | 
						|
    end
 | 
						|
 | 
						|
    return cls
 | 
						|
end
 |