es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo usar una función de devolución de llamada en una clase con herencia

Cómo puedo usar un método del padre en un método hijo que se utiliza como una función de devolución de llamada

class Parent {
    numbers: number[];

    constructor(numbers: number[]) {
        this.numbers = numbers;
    }

    protected iterateNumbers(iterCallback: (nb: number) => void): void {
        for (const nb of this.numbers) {
            iterCallback(nb);
        }
    }

    protected inc(nb: number): number {
        return nb++;
    }
}

class Child extends Parent {
    constructor(numbers: number[]) {
        super(numbers)
    }

    getNumbers(): void {
        this.iterateNumbers(this.displayNumber.bind(this));
    }

    private displayNumber(nb: number): void {
        console.log(this.inc(nb));
    }
}

const c = new Child([1, 2, 3, 4, 5]);
c.getNumbers();

Este código arroja el siguiente error: TypeError: No se puede leer la propiedad 'inc' de indefinido

modificado con super()

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para utilizar un método del padre en un método hijo que se utiliza como función de devolución de llamada, puedes utilizar la palabra clave super para llamar al método del padre dentro del método del hijo. En el código proporcionado, displayNumber es una función de devolución de llamada que se pasa a iterateNumbers y se invoca para cada número en el array numbers. Sin embargo, this.inc no puede ser accedido en displayNumber ya que this se refiere a la función de devolución de llamada en sí misma, no a la instancia de Child. Para solucionar este problema, podemos modificar el método displayNumber en Child de la siguiente manera:

    class Child extends Parent {
        constructor(numbers: number[]) {
            super(numbers)
        }
    
        getNumbers(): void {
            this.iterateNumbers((nb: number) => this.displayNumber(nb));
        }
    
        private displayNumber(nb: number): void {
            console.log(super.inc(nb));
        }
    }
    
    const c = new Child([1, 2, 3, 4, 5]);
    c.getNumbers();
    

    En el método getNumbers, envolvemos el método displayNumber en una función de flecha que vincula this a la instancia de Child. Esto asegura que this.inc se pueda llamar dentro de displayNumber utilizando la palabra clave super, que se refiere a la clase Parent.

    Con estas modificaciones, el código debería mostrar correctamente los valores incrementados del array numbers en la consola.

Comments are closed.