为什么我的Lua类实现不起作用?

我在我的lua环境中实现了面向对象编程,但似乎不起作用。

我认为这与如何处理__index以及我的错误使用require和module有关,但我不确定100%。

这是代码:

   Class = function( prototype )
    local derived = {}
    local derivedMT = {
        --当从派生类中检索时,也要检查基类
        __index = prototype,

        --当调用类时,返回一个实例
        __call = function( proto, ... )
            local instance = {}
            local instanceMT = {
                --当检索到一个实例时,也要检查类层次结构。
                __index = derived,
                --调用实例是不合适的!
                __call = function()
                    print( "WARNING! Attempt to invoke an instance of a class!" )
                    print( debug.traceback() )
                    return instance
                end,
            }
            setmetatable( instance, instanceMT )

            if ( instance.__constructor ) then
                instance:__constructor( ... )
            end

            return instance
        end,
    }
    setmetatable( derived, derivedMT )
    return derived
end

这是我如何使用它的方式,空引用是对基类函数的调用,即我所遇到的错误/问题是似乎没有参考基类。

require "Core.Camera.FreeCamera"

local T = Core.Camera.FreeCamera.FreeCamera(0,0,-35)

c = T:getObjectType() -- 空引用
print(c .." --Type" )

这是Camera.lua基类

local _G = _G
module(...)

local M = _G.Class()
Camera = M

function M:__constructor(x,y,z) --这永远不会调用。
    --self.Active = false
    --self.x = x
    --self.y = y
    --self.z = z
    --self.ID = EngineManager:getCamera()
    print("InCameraInstance_-_-_-_-_-__-_--_-__-_-_-_--_-_-_-_-_--_-_-_--_--__-_---_--_---__-")
end

function M:getObjectType()
    return "camera"
end

最后是尝试继承相机的自由相机。

local require = require
local _G = _G

module(...)

require "Core.Camera.Camera"

local M = _G.Class( _G.Core.Camera.Camera ) -- 糟糕,糟糕,可能是罪魁祸首
FreeCamera = M

function M:__constructor(x,y,z) ---糟糕,这确实被调用了...另一个没有
self.Active = false
    self.x = x
    self.y = y
    self.z = z
    self.ID = _G.EngineManager:getCamera()
    --_G.print("got Id of:" .. self.ID)
    self:setCameraPosition(x, y, z, self.ID)
    _G.print("<<<Camera in lua>>>")
end

我策划了所有的想法,任何帮助将不胜感激。

原文链接 https://stackoverflow.com/questions/2255876

点赞
stackoverflow用户189205
stackoverflow用户189205

在代码中,将原本的类名 Camera 改为 Camera.Camera,因为前面的 Camera 是文件夹名,后面的 Camera 才是实际的模块名和类名。

编辑: 可以这样简化代码:

local CameraModule = require "Core.Camera.Camera"
local M = _G.Class(CameraModule.Camera)

其中,CameraModule 是指导入的 Core.Camera.Camera 模块,CameraModule.Camera 则表示该模块中的 Camera 类。

2010-02-13 00:28:54