Clases, herencia e imports

Objetivo de aprendizaje

  • Estructurar programas Lucia con clases e imports multiarchivo.

Sintaxis clave

class Animal {
    let name: string = "unknown";
    const kind: string = "animal";
    constructor(name: string) { this.name = name; }
}

class Dog extends Animal {
    func bark() { print(this.name); }
}

Ejemplos

  • Import: import "./models/pet.lucia";.
  • Tambien puedes importar archivos del proyecto como import "Palo.lucia";.
  • Herencia simple con extends.
  • Los campos de clase pueden tener inicializadores por defecto.
  • Los campos de clase pueden declararse con const cuando no deben reasignarse.
  • Uso de this para estado de instancia.

Acceso a metodos y campos dentro de la clase

  • Estilo explicito:
func toString(): string {
    return this.obtenerNombreValor() + " " + this.obtenerNombrePalo();
}
  • Estilo implicito (permitido):
func toString(): string {
    return obtenerNombreValor() + " " + obtenerNombrePalo();
}

Asignacion por indice en metodos

func mezclarMazo(): void {
    let n: int = len(this.mazo);
    for (let i = 0; i < n; i = i + 1) {
        let j: int = random(0, n - 1);
        let temp: Carta = this.mazo[i];
        this.mazo[i] = this.mazo[j];
        this.mazo[j] = temp;
    }
}

Errores comunes

  • Olvidar que un campo const de clase requiere inicializador.
  • Reasignar un campo const despues de declararlo.
  • Clase/funcion desconocida por import faltante.
  • Imports ciclicos entre archivos.
  • Usar list.length() en lugar de len(list).

Practica sugerida

  • Divide un modelo de dominio en 2-3 archivos con imports, herencia y campos inicializados.

Practica extendida

  • Crea Carta y Tablero en archivos separados.
  • Implementa creacion y mezcla del mazo con asignacion por indice.
  • Imprime etiquetas de carta con interpolacion y metodos auxiliares.

Relacionados

  • declarations-let-const
  • diagnostics