Классы с помощью замыканий


local function Animal(initName, initSize)
    local public = {
        name = initName or 'N/A'
    }

    local private = {
        size = initSize or '0'
    }

    function public.voice()
        print( 'Animal ' .. public.name .. ' ' .. private.size)
    end

    function public.getSize()
        return private.size
    end

    function public.getClassName()
        return 'Animal'
    end

    return public
end

local function Dog(initName,initSize)
    local obj = Animal(initName,initSize)

    function obj.voice()
        print( 'Dog ' .. obj.name .. ' ' .. obj.getSize())
    end

    function obj.getClassName()
        return 'Dog'
    end

    return obj
end

local a = Animal(nil,100)
a.voice()

local b = Dog('Rex',200)
b.voice()

local c = Dog('Max',300)
c.voice()

d = { a,b,c }
for i=1,#d do
    print( ( d[i].getClassName()=='Dog' ) and 'dog' or '?' )
end