Programación orientada a objetos en Lua

Ejemplos y plantillas para Autoplay Media Studio.
Hoy les traigo un pequeño código que construí para poder utilizar los objetos de AMS como 'objetos' usando el paradigma de programación orientada a objetos.

El código es algo simple y permite lo más básico para simular objetos propiedades y herencia, existen librerias mucho mas completas para hacer esto en Lua pero como no me gusta agregar demasiados módulos de terceros y me gusta hacer mis propias cosas, bueno...

Son al rededor de 30 lineas de codigo que les permiten crear un objeto, asignarle métodos, propiedades y crear objetos que hereden los métodos y propiedades de este.

Ver el modulo: thoop.lua


Para los que no conozcan la programación orientada a objetos pueden ver el siguiente ejemplo en el que creamos un Humano, luego un Programador y por ultimo una persona que obtiene las caracteristicas de los 2 anteriores:
-- Creamos la clase Humano:
Humano = class {
	-- Nuestro Humano tendrá las siguientes propiedades:
	Nombre, Edad = 0, Profesion,
	
	-- Vamos a asignarle un método que servirá para acceder a estas propiedades. Será 'get'
	get = function (self, sval)
		return self[sval]
	end

}

-- Creamos una clase derivada de nuestro Humano
Programador = Humano {
	-- Programador heredará las propiedades de Humano y tendrá una más que será "Lenguajes"
	Profesion = "Programador", Lenguajes
}

-- Creamos una Persona (objeto) que derivará de la clase Programador...
TheDary = Programador { -- TheDary es un programador pero sigue siendo Humano y podemos asignarle un nombre y una edad:
	Nombre = "Dario Cano", Edad = 17, Lenguajes = "LUA, HTML, JS, C++" 
}

-- Podemos acceder a las propiedades de nuestros objetos de la siguiente forma:

sName = TheDary.Nombre
sEdad = TheDary.Edad
sProf = TheDary.Profesion -- Aunque no definimos la profesion de TheDary, el objeto deriva de la clase Programador por lo tanto él es un Programador

-- Tambien podemos acceder a las propiedades con el método "get" que tiene la clase Humano:

sLangs = TheDary:get("Lenguajes")

print(sName.."\n"..sEdad.."\n"..sProf.."\nLenguajes: ".. sLangs)

-- Podemos asignarle más métodos a nuestros objetos:

function Humano:set (self, sval, sdat) -- El método "set" servirá para cambiar propiedades
	self[sval] = sdat
end

TheDary:set("Profesion", "Programador/Desarrollador")

print("\nNueva profesion: ", TheDary:get("Profesion"))

Crear humanos puede no parecerle util a muchos pero es una forma fácil de entenderlo.

También dejo un ejemplo de utilidad; una APZ en la que podrán ver mi código en acción creando una clase llamada botón y cambiandole las propiedades en tiempo de ejecución. Si alguna vez quisieron hacer una aplicación que soporte plugins o addons este sería un buen comienzo para ustedes.

thoop.apz

Antes que lo digan...
El código puede ser mejorado y gracias a la versatilidad de Lua podemos agregar propiedades privadas y publicas y más cosas utilizando metatablas. Si alguien está más interesado en esto y necesita una solución más completa puede utilizar el modulo LOOP o leer los documentos que hay en la wiki de Lua sobre metatablas.

Pueden leer el post anterior para hacer un uso más cómodo de lo explicado acá:
http://amsspecialist.com/viewtopic.php?f=12&t=2558

Espero les sirva, saludos

Añadido el ejemplo, disculpen lo había olvidado

Código: Seleccionar todo

https://db.tt/XqMs4Fn6

Si mal no recuerdo habia un plugin que pasaba las referencias de los objetos a oop, asi podias llamar a un Label.GetText("label1") por label1:GetText();

El problema de oop en autoplay es que la densidad del codigo usando oop, imaginando que el proyecto puede ser algo grande y con un editor tan pequeño y poco funcional...

Gracias