// referencia a la clase pokemon 
// https://gist.github.com/konami12/2359d276454cdcb81d291597a042e375

/*
    Para poder implementar el polimorfismo iniciaremos 
    aplicando el principio de herencia.
*/
class TypeFire extends Pokemon {

    constructor(name, evolutions) {
        super(name, "fire", evolutions);
    }

    message() {
        // Utilizamos uno de los métodos de la clase padre 
        return `Hola soy ${this.name} y soy de tipo fuego`;
    }
}

/*
    Creamos la instancia de la clase "TypeFire"
    pero en este ejemplo no modificamos el mêtodo attack
*/
const Charmander = new TypeFire("Charmander", ["Charmeleon", "Charizar"]);
/*
    Invocamos el mêtodo attack pero aun 
    tendra el comportamiento definido por
    la clase padre.
*/
const ATTACK_FIRE = Charmander.attack();

console.log(ATTACK_FIRE);
// Salida : // Charmander, esta atacando.


/*
    Para poder implementar el polimorfismo iniciaremos 
    aplicando el principio de herencia.
*/
class TypeFire extends Pokemon {

    constructor(name, evolutions) {
        super(name, "fire", evolutions);
    }

    message() {
        // Utilizamos uno de los métodos de la clase padre 
        return `Hola soy ${this.name} y soy de tipo fuego`;
    }

    /*
        En este caso sobre escribimos el mêtodo attack
        para definir un nuevo comportamiento.
    */
    attack() {
        return `${this.name}, ataca con Aliento Igneo`;
    }
}

/*
    Creamos la instancia de la clase "TypeFire"
*/
const Charmander = new TypeFire("Charmander", ["Charmeleon", "Charizar"]);
/*
    Invocamos el mêtodo attack pero en esta
    ocación conseguiremos una repuesta diferente.
*/
const ATTACK_FIRE = Charmander.attack();

console.log(ATTACK_FIRE);
// Salida  Charmander, ataca con Aliento Igneo.