Emulación de clases
El simulador tiene muchas entidades que se comportan como objetos y clases en términos de lenguajes orientados a objetos. Para facilitar la manipulación de dichos objetos, se emularon las relaciones "clase-objeto" en el entorno Lua con metatablas. Este marco se encuentra en ./Scripts/Common/LuaClass.Lua.
“Class" de Lua es una tabla que tiene la siguiente estructura:
Class = {
static = {
staticFunc1 = function(...)
...
end,
...
staticFuncN = function(...)
...
end
},
member = {
memberFunc1 = function(objectID, ...)
...
end,
...
memberFuncM = function(objectID, ...)
...
end
},
className_ = "ClassName",
parentClass_ = Class
}
static
- Tabla con funciones "static". Estas funciones no tienen ningún id de objeto como parámetro.
member
className_
- String con el nombre de la clase.
parentClass_
-
Referencia a la tabla de clases padre.
"Objeto" de Lua es una tabla que tiene la siguiente estructura:
ObjectName = {
id_ = ...
}
id_
Object identifier. Su tipo depende de la clase. Las funciones "member" de "clases" de Lua tienen este identificador como primer argumento.
Los objetos de la misma clase tienen establecida la misma metatabla: la tabla de clases.
El marco permite la herencia simple, pero no permite la herencia múltiple. La tabla de la clase base debe ser el valor de la tabla del campo
parentClass_ de la clase derivada.
La tabla
LuaClass debe ser asignada como metatabla a todas las "clases" de Lua.
LuaClass hace todo el trabajo cuando el usuario utiliza "clases" y "objetos" de Lua. El metamétodo
LuaClass.__index es una función que busca la función que el usuario quiere llamar en la "clase" de Lua a la que pertenece el "objeto" de Lua o en las "clases" base y llama a la función.
LuaClass también tiene varias funciones útiles que pueden ser llamadas desde cualquier "clase" de Lua.
function LuaClass.createFor(class, id_)
crea y devuelve "objeto" de Lua que pertenece a la "clase" de Lua y tiene el identificador id_. No se crea ninguna entidad nueva. La función sólo crea e inicializa la tabla "objeto" de Lua para la entidad existente.
function LuaClass.create(class, ...)
utiliza la función class.static.create para crear una nueva entidad y luego utiliza LuaClass.createFor
para crear la clase "objeto" de Lua para la entidad recién creada.
function LuaClass.cast(class, object)
"Cast" o convierte el objeto en un objeto de otra clase. El "downcast" puede ser inseguro si el usuario convierte el objeto a una clase a la que el objeto no pertenece realmente.
function class(tbl, parent)
declara la tabla tbl como una "clase" de Lua y como una clase derivada de parent si parent no es nulo.