interface Shape { area(): number; } interface SolidShape { volume(): number; } class Circle implements Shape { constructor(private readonly radius: number) {} area(): number { return Math.PI * Math.pow(this.radius, 2); } } class Square implements Shape { constructor(private readonly length: number) {} area(): number { return Math.pow(this.length, 2); } } class Cube implements Shape, SolidShape { area(): number { return 0; } volume(): number { return 0; } } interface SumCalculator { sum(): number; } class AreaCalculator implements SumCalculator { constructor(private readonly shapes: Shape[]) {} public sum(): number { return this.shapes.reduce((total, shape) => total + shape.area(), 0); } } class VolumeCalculator implements SumCalculator { constructor(private readonly shapes: SolidShape[]) {} public sum(): number { return this.shapes.reduce((total, shape) => total + shape.volume(), 0); } } class SumConsoleOutputter { constructor(private readonly calculator: SumCalculator) {} public output(): void { const sum = this.calculator.sum(); console.log(`Somme : ${sum}`); } } let calculator: SumCalculator = new AreaCalculator([ new Circle(5), new Square(4), ]); let outputter = new SumConsoleOutputter(calculator); outputter.output(); // affiche la somme des aires calculator = new VolumeCalculator([new Cube(), new Cube()]); outputter = new SumConsoleOutputter(calculator); export default {};