El Principio de Sustitución de Liskov (LSP) busca asegurar que una clase derivada pueda sustituir a su clase base sin que el comportamiento del programa se vea afectado. Esto implica que cualquier instancia de una subclase debe ser intercambiable con instancias de la clase base, sin necesidad de que el código que utiliza estas instancias tenga que distinguir entre la clase base y la derivada. Así, los métodos definidos en la clase base deben ser utilizables por las subclases, permitiendo el reemplazo de objetos sin causar errores ni alteraciones en la funcionalidad prevista.
import { Tesla, Audi, Toyota, Honda } from './03-liskov-b';
(() => {
const printCarSeats = ( cars: (Tesla | Audi | Toyota | Honda)[] ) => {
for (const car of cars) {
if( car instanceof Tesla ) {
console.log( 'Tesla', car.getNumberOfTeslaSeats() )
continue;
}
if( car instanceof Audi ) {
console.log( 'Audi', car.getNumberOfAudiSeats() )
continue;
}
if( car instanceof Toyota ) {
console.log( 'Toyota', car.getNumberOfToyotaSeats() )
continue;
}
if( car instanceof Honda ) {
console.log( 'Honda', car.getNumberOfHondaSeats() )
continue;
}
}
}
const cars = [
new Tesla(7),
new Audi(2),
new Toyota(5),
new Honda(5),
];
printCarSeats( cars );
})();
export class Tesla {
constructor( private numberOfSeats: number ) {}
getNumberOfTeslaSeats() {
return this.numberOfSeats;
}
}
export class Audi {
constructor( private numberOfSeats: number ) {}
getNumberOfAudiSeats() {
return this.numberOfSeats;
}
}
export class Toyota {
constructor( private numberOfSeats: number ) {}
getNumberOfToyotaSeats() {
return this.numberOfSeats;
}
}
export class Honda {
constructor( private numberOfSeats: number ) {}
getNumberOfHondaSeats() {
return this.numberOfSeats;
}
}
Aplicacion de Liskov
import { Tesla, Audi, Toyota, Honda, Volvo, Vehicle, Ford } from './03-liskov-b';
(() => {
const printCarSeats = ( cars: Vehicle[] ) => {
cars.forEach( car => {
console.log( car.constructor.name, car.getNumberOfSeats() );
});
}
const cars = [
new Tesla(7),
new Audi(2),
new Toyota(5),
new Honda(5),
new Volvo(2),
new Ford(2),
];
printCarSeats( cars );
})();
export abstract class Vehicle {
abstract getNumberOfSeats(): number;
}
export class Tesla extends Vehicle {
constructor( private numberOfSeats: number ) {
super();
}
getNumberOfSeats() {
return this.numberOfSeats;
}
}
export class Audi extends Vehicle{
constructor( private numberOfSeats: number ) {
super();
}
getNumberOfSeats() {
return this.numberOfSeats;
}
}
export class Toyota extends Vehicle{
constructor( private numberOfSeats: number ) {
super();
}
getNumberOfSeats() {
return this.numberOfSeats;
}
}
export class Honda extends Vehicle{
constructor( private numberOfSeats: number ) {
super();
}
getNumberOfSeats() {
return this.numberOfSeats;
}
}
export class Volvo extends Vehicle{
constructor( private numberOfSeats: number ) {
super();
}
getNumberOfSeats() {
return this.numberOfSeats;
}
}
export class Ford extends Vehicle{
constructor( private numberOfSeats: number ) {
super();
}
getNumberOfSeats() {
return this.numberOfSeats;
}
}