Clases y POO

Forja soporta programación orientada a objetos con clases, constructores, métodos y el keyword este (equivalente a self en Rust o this en otros lenguajes).

Estructura de una clase

🧱 Plantilla
clase Nombre {
    campo1
    campo2

    constructor(param1, param2) {
        este.campo1 = param1
        este.campo2 = param2
    }

    funcion metodo() {
        // usar este.campo
    }
}

Ejemplo completo

Una clase Estudiante con campos, constructor y métodos:

🎓 Clase Estudiante
clase Estudiante {
    nombre
    edad

    constructor(n, e) {
        este.nombre = n
        este.edad = e
    }

    funcion presentarse() {
        escribir("Hola, soy " + este.nombre +
                " y tengo " + este.edad + " años")
    }

    funcion esMayorDeEdad() -> Booleano {
        retornar este.edad >= 18
    }
}

// Uso
variable alumno = nuevo Estudiante("Ana", 20)
alumno.presentarse()
// → Hola, soy Ana y tengo 20 años

si (alumno.esMayorDeEdad()) {
    escribir("Es mayor de edad")
}

Keyword este

este se refiere a la instancia actual. Se usa para acceder a campos y métodos propios desde adentro de la clase:

ForjaRust / Otros
este.nombreself.nombre / this.nombre
este.edad = 10self.edad = 10

Keyword nuevo

Instancia una clase y (si existe) llama al constructor automáticamente:

🚀 Instanciación posicional
variable p = nuevo Persona("Juan")    // con constructor posicional
variable q = nuevo Punto()               // sin constructor

Inicialización struct-literal

Podés inicializar objetos usando llaves con nombres de campo, sin necesidad de definir un constructor posicional:

🏗️ Struct-literal
clase Persona {
    nombre
    edad
}

// Inicialización con llaves y nombres de campo
variable p = nuevo Persona { nombre: "Ana", edad: 25 }
escribir(p.nombre) // → "Ana"
escribir(p.edad)   // → 25
💡 La sintaxis struct-literal nuevo Clase { campo: valor } es especialmente útil cuando la clase tiene muchos campos. El orden de los campos no importa y el código resulta más legible.

Clase sin constructor

Si no definís un constructor, los campos se inicializan con nulo:

📍 Punto 2D
clase Punto {
    x
    y
}

variable p = nuevo Punto()
escribir(p.x)  // → nulo (no inicializado)

Traits e interfaces

Las clases pueden implementar rasgos (interfaces) con rasgo e implementa:

🧬 Rasgo + Clase
rasgo Volador {
    funcion volar() -> Texto
}

clase Pajaro {
    nombre
    constructor(n) { este.nombre = n }
}

implementa Volador para Pajaro {
    funcion volar() -> Texto {
        retornar este.nombre + " vuela"
    }
}
💡 Los rasgos se definen con rasgo y se implementan con implementa ... para. Son equivalentes a trait e impl ... for en Rust.

Equivalencia con Rust

ForjaRust generado
clase X { ... }struct X { ... } + impl X { ... }
constructor(p) { ... }fn nuevo(p: String) -> Self { ... }
este.campoself.campo
nuevo X(args)X::nuevo(args)
nuevo X { campo: val }X { campo: val }
objeto.metodo()objeto.metodo()