0Pricing
Lua Academy · Lección

Diseño de clases base y constructores

Diseñe una fábrica Class() que configure metatablas y constructores new().

Diseño de clases base y constructores es una lección gratuita de Lua Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Lua Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Lua Academy incluye 4 lecciones en total.

Objetivo: una fábrica de clases reutilizable

Queremos una función Class() que devuelva un nuevo objeto de clase con un constructor adecuado, búsqueda de métodos y semántica de POO correctas.

Esqueleto de la fábrica de clases

La fábrica crea una tabla de clase con una metatabla para despachar los métodos.

local function Class()
  local cls = {}
  cls.__index = cls
  cls.__name = "AnonymousClass"
  function cls:new(...)
    local instance = setmetatable({}, cls)
    if instance.init then instance:init(...) end
    return instance
  end
  return cls
end

Definición de una clase

Cree una clase, defina init (el constructor) y añada métodos.

local Animal = Class()
Animal.__name = "Animal"
function Animal:init(name, sound)
  self.name = name
  self.sound = sound
end
function Animal:speak()
  print(self.name .. " says " .. self.sound)
end
local cat = Animal:new("Cat", "Meow")
cat:speak()  -- Cat says Meow

Patrón del constructor

El constructor :new(...) crea una instancia mediante setmetatable({}, cls) y después llama a :init(...) para inicializarla. Esto separa la asignación de la inicialización.

Nombre de clase para depuración

Almacene cls.__name y defina __tostring para que las instancias se muestren de forma significativa.

function Animal:__tostring()
  return "<" .. Animal.__name .. ": " .. self.name .. ">"
end
print(tostring(cat))  -- <Animal: Cat>

Valores predeterminados en init

Proporcione valores predeterminados en init utilizando or.

function Vehicle:init(opts)
  self.speed  = opts.speed  or 0
  self.fuel   = opts.fuel   or 100
  self.engine = opts.engine or "petrol"
end

Métodos de clase frente a métodos de instancia

Los métodos definidos con function cls.method() son métodos de clase (no reciben self). Los métodos definidos con function cls:method() reciben la instancia como self.

Propiedades estáticas

Las propiedades establecidas directamente en la tabla de clase se comparten entre todas las instancias, a menos que los campos de instancia las oculten.

Animal.count = 0
function Animal:init(name, sound)
  Animal.count = Animal.count + 1
  self.name = name; self.sound = sound
end
print(Animal.count)  -- 0
Animal:new("Dog","Woof")
print(Animal.count)  -- 1

Constructor de copia

Un método :clone() crea una copia de una instancia copiando superficialmente sus campos.

function Animal:clone()
  local copy = setmetatable({}, getmetatable(self))
  for k, v in pairs(self) do copy[k] = v end
  return copy
end

Metamétodo de igualdad

Defina __eq para realizar comparaciones de igualdad significativas entre instancias.

Animal.__eq = function(a, b)
  return a.name == b.name
end

¿Por qué no utilizar rawget?

Utilice self.field (no rawget) para permitir el acceso a campos mediante metamétodos en las clases derivadas. Utilice rawget únicamente cuando necesite omitir explícitamente ese mecanismo.

Pregunta sobre el diseño del constructor

¿Por qué se llama a init por separado del asignador new?

Repaso: clase base y constructor

Una fábrica Class() crea una tabla como clase, establece __index = cls para buscar métodos y proporciona :new() y :init(). Esta es la base de todos los patrones de POO en Lua.

Preguntas frecuentes

¿La lección «Diseño de clases base y constructores» es gratis?

Sí — el texto completo de «Diseño de clases base y constructores» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Lua Academy, actualiza a CoddyKit PRO. El curso de Lua Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Diseño de clases base y constructores»?

Diseñe una fábrica Class() que configure metatablas y constructores new(). Practicas Lua Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Lua Academy?

No se requiere experiencia previa. Lua Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «Diseño de clases base y constructores»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Lua Academy?

Sí. Cada lección de Lua Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Diseño de clases base y constructores
  2. Herencia multinivel
  3. Composición de mixins y comprobaciones de interfaces
  4. instanceof e introspección de tipos
← Volver a Lua Academy