# Clases, herencia e imports

## Objetivo de aprendizaje
- Estructurar programas Lucia con clases e imports multiarchivo.

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

class Dog extends Animal {
    func bark(): void { 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:
```lucia
func toString(): string {
    return this.obtenerNombreValor() + " " + this.obtenerNombrePalo();
}
```
- Estilo implicito (permitido):
```lucia
func toString(): string {
    return obtenerNombreValor() + " " + obtenerNombrePalo();
}
```

## Asignacion por indice en metodos
```lucia
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
