2010-02-12 2 views
2

J'ai implémenté la POO dans mon environnement LUA mais ça ne semble pas marcher.Pourquoi mon implémentation de classe Lua ne fonctionne-t-elle pas?

Je pense que cela a quelque chose à voir avec la façon dont je gère le __index et mon utilisation incorrecte de require et module, mais je ne suis pas sûr à 100%.

Voici le code:

Class = function(prototype) 
    local derived = {} 
    local derivedMT = { 
     --When indexing into a derived class, check the base class as well 
     __index = prototype, 

     --When invoking a class, return an instance 
     __call = function(proto, ...) 
      local instance = {} 
      local instanceMT = { 
       --When indexing into an instance, check the class hierarchy as well. 
       __index = derived, 
       --Calling instances is a no-no! 
       __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 

Et voici comment je l'utilise, la référence nul est un appel à une fonction de classe de base, qui est l'erreur/problème im avoir est il semble que la base La classe n'est pas référencée.

require "Core.Camera.FreeCamera" 

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

c = T:getObjectType() -- nil reference 
print(c .." --Type") 

et voici Camera.lua la classe de base

local _G = _G 
module(...) 



local M = _G.Class() 
Camera = M 

function M:__constructor(x,y,z) --This never gets called. 
    --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 

Enfin caméra libre qui tente d'hériter la caméra.

local require = require 
local _G = _G 

module(...) 

require "Core.Camera.Camera" 

local M = _G.Class(_G.Core.Camera.Camera) --Gross, lame might be the culprit 
FreeCamera = M 

function M:__constructor(x,y,z) ---WHOOPS, this does get called... the other one doesnt 
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 

Je suis à court d'idées. Toute aide serait appréciée.

+0

Désolé, constructeur photo gratuit ne s'appelle ... La caméra ne marche pas de – Joe

Répondre

5

Au lieu de:

local M = _G.Class(_G.Core.Camera.Camera) 

vous devez avoir:

local M = _G.Class(_G.Core.Camera.Camera.Camera) 

Première Camera est le nom du répertoire, le second est le nom du module, troisième est le nom de la classe.

Modifier: Vous pouvez nettoyer un peu comme ceci:

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

Wow ... c'est méchant ... merci beaucoup pour l'aide ... je souhaite qu'il y avait un moyen de le nettoyer. – Joe

+0

@Joe, il y a un moyen - voir l'édition. – interjay

+0

Doux, merci beaucoup. – Joe

Questions connexes