1+ /**
2+ * EJERCICIO:
3+ * Explora el "Principio SOLID de Sustitución de Liskov (Liskov Substitution Principle, LSP)"
4+ * y crea un ejemplo simple donde se muestre su funcionamiento
5+ * de forma correcta e incorrecta.
6+ *
7+ * DIFICULTAD EXTRA (opcional):
8+ * Crea una jerarquía de vehículos. Todos ellos deben poder acelerar y frenar, así como
9+ * cumplir el LSP.
10+ * Instrucciones:
11+ * 1. Crea la clase Vehículo.
12+ * 2. Añade tres subclases de Vehículo.
13+ * 3. Implementa las operaciones "acelerar" y "frenar" como corresponda.
14+ * 4. Desarrolla un código que compruebe que se cumple el LSP.
15+ */
16+
17+
18+ // Incorrect
19+
20+
21+ class BirdWrong {
22+ fly ( ) {
23+ return 'Flying' ;
24+ }
25+ } ;
26+
27+
28+ class OstrichWrong extends BirdWrong {
29+ fly ( ) {
30+ throw new Error ( 'Ostriches can\'t fly' ) ;
31+ }
32+ } ;
33+
34+
35+ // let bird = new BirdWrong();
36+ // console.log(bird.fly()); // Flying
37+ // let ostrich = new OstrichWrong();
38+ // console.log(ostrich.fly()); // Error
39+
40+
41+ // Correct
42+
43+
44+ class Bird {
45+ move ( ) {
46+ return 'FLying' ;
47+ }
48+ } ;
49+
50+
51+ class Ostrich extends Bird {
52+ move ( ) {
53+ return 'Walking' ;
54+ }
55+ } ;
56+
57+
58+ const bird = new Bird ( ) ;
59+ console . log ( bird . move ( ) ) ; // Flying
60+ const ostrich = new Ostrich ( ) ;
61+ console . log ( ostrich . move ( ) ) ; // Walking
62+
63+
64+ /*
65+ * DIFICULTAD EXTRA (opcional):
66+ * Crea una jerarquía de vehículos. Todos ellos deben poder acelerar y frenar, así como
67+ * cumplir el LSP.
68+ * Instrucciones:
69+ * 1. Crea la clase Vehículo.
70+ * 2. Añade tres subclases de Vehículo.
71+ * 3. Implementa las operaciones "acelerar" y "frenar" como corresponda.
72+ * 4. Desarrolla un código que compruebe que se cumple el LSP.
73+ */
74+
75+
76+ class Vehicle {
77+ constructor ( speed = 0 ) {
78+ this . speed = speed ;
79+ }
80+
81+ accelerate ( increment ) {
82+ this . speed += increment ;
83+ console . log ( `Speed: ${ this . speed } km/h` ) ;
84+ }
85+
86+ brake ( decrement ) {
87+ this . speed -= decrement ;
88+ console . log ( `Speed: ${ this . speed } km/h` ) ;
89+ }
90+ } ;
91+
92+
93+ class Motorbike extends Vehicle {
94+ constructor ( speed = 0 ) {
95+ super ( speed ) ;
96+ }
97+
98+ accelerate ( increment ) {
99+ console . log ( 'Motorbike is accelerating...' ) ;
100+ super . accelerate ( increment ) ;
101+ }
102+
103+ brake ( decrement ) {
104+ console . log ( 'Motorbike is braking...' ) ;
105+ super . brake ( decrement ) ;
106+ }
107+ } ;
108+
109+
110+ class Car extends Vehicle {
111+ constructor ( speed = 0 ) {
112+ super ( speed ) ;
113+ }
114+
115+ accelerate ( increment ) {
116+ console . log ( 'Car is accelerating...' ) ;
117+ super . accelerate ( increment ) ;
118+ }
119+
120+ brake ( decrement ) {
121+ console . log ( 'Car is braking...' ) ;
122+ super . brake ( decrement ) ;
123+ }
124+ } ;
125+
126+
127+ class Bicycle extends Vehicle {
128+ constructor ( speed = 0 ) {
129+ super ( speed ) ;
130+ }
131+
132+ accelerate ( increment ) {
133+ console . log ( 'Bicycle is accelerating...' ) ;
134+ super . accelerate ( increment ) ;
135+ }
136+
137+ brake ( decrement ) {
138+ console . log ( 'Bicycle is braking...' ) ;
139+ super . brake ( decrement ) ;
140+ }
141+ } ;
142+
143+
144+ function testVehicle ( vehicle ) {
145+ vehicle . accelerate ( 10 ) ;
146+ vehicle . brake ( 2 ) ;
147+ console . log ( '' ) ;
148+ } ;
149+
150+
151+ const motorbike = new Motorbike ( ) ;
152+ const car = new Car ( ) ;
153+ const bicycle = new Bicycle ( ) ;
154+
155+ testVehicle ( motorbike ) ;
156+ testVehicle ( car ) ;
157+ testVehicle ( bicycle ) ;
0 commit comments