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 requerir sobrecargas compatibles con Liskov en TypeScript?

Con la siguiente configuración:

class Base {
    doSomething(value: unknown): void {}
}

class Child extends Base {
    override doSomething(): void {}
}

… Esperaba un error del compilador relacionado con la falta del parámetro value: unknown en la sobrecarga de doSomething en Child, debido a la violación del Principio de Sustitución de Liskov (LSP), pero no existe dicho error (como se ve en el entorno de prueba).

¿Existe alguna forma de hacer que Child.doSomething() extienda Base.doSomething() en lugar de anularlo completamente?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, para hacer que Child.doSomething() se extienda a Base.doSomething(), en lugar de reemplazarlo por completo, puedes usar la sobrecarga de funciones junto con la palabra clave super en el método de sobreescritura. Aquí tienes un ejemplo de cómo puedes lograr esto:

    class Base {
      doSomething(value: unknown): void {
        console.log(`Base doSomething llamado con valor: ${value}`);
      }
    }
    
    class Child extends Base {
      doSomething(value: string): void;
      doSomething(): void {
        super.doSomething(<unknown>"doSomething de Child");
      }
    }
    
    const child = new Child();
    child.doSomething(); // Salida: "Base doSomething llamado con valor: doSomething de Child"
    child.doSomething("hola"); // Salida: "Base doSomething llamado con valor: hola"
    

    En este ejemplo, estamos utilizando la sobrecarga de funciones en Child para especificar dos sobrecargas para doSomething: una que toma un parámetro string y otra que no toma ningún parámetro. La implementación de la sobrecarga que toma un parámetro simplemente llama a la implementación super con el parámetro, mientras que la implementación de la sobrecarga sin parámetros llama a la implementación super con una cadena específica.

    De esta manera, estamos haciendo que Child.doSomething() se extienda a Base.doSomething() llamando a la implementación super dentro del método de sobreescritura.

Comments are closed.