Skip to content

Commit daaf40f

Browse files
authored
Merge pull request #4831 from ASJordi/main
#28 - Java
2 parents e34fa81 + ac203e7 commit daaf40f

File tree

1 file changed

+146
-0
lines changed

1 file changed

+146
-0
lines changed
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
/*
2+
El Principio de Sustitución de Liskov (LSP) establece que las subclases deben ser sustituibles por sus clases base.
3+
Es decir, dado que la clase B es una subclase de la clase A, deberíamos poder pasar un objeto de la clase B a cualquier método que espere un objeto de la clase A sin que se produzca un error.
4+
Este es el comportamiento esperado, dado que cuando se utiliza la herencia se asume que la subclase hereda todos los comportamientos de la superclase.
5+
La subclase extiende el comportamiento, pero nunca lo reduce.
6+
*/
7+
8+
public class Main {
9+
10+
public static void main(String[] args) {
11+
// Comprobación LSP
12+
Vehiculo vehiculoDeportivo = new VehiculoDeportivo();
13+
Vehiculo vehiculoFamiliar = new VehiculoFamiliar();
14+
Vehiculo vehiculoCarga = new VehiculoCarga();
15+
16+
vehiculoDeportivo.acelerar();
17+
vehiculoDeportivo.frenar();
18+
19+
vehiculoFamiliar.acelerar();
20+
vehiculoFamiliar.frenar();
21+
22+
vehiculoCarga.acelerar();
23+
vehiculoCarga.frenar();
24+
}
25+
26+
/*
27+
EJERCICIO:
28+
Explora el "Principio SOLID de Sustitución de Liskov (Liskov Substitution Principle, LSP)"
29+
y crea un ejemplo simple donde se muestre su funcionamiento
30+
de forma correcta e incorrecta.
31+
*/
32+
33+
interface Animal {
34+
void comer();
35+
void nadar();
36+
}
37+
38+
static class Jirafa implements Animal {
39+
@Override
40+
public void comer() {
41+
System.out.println("La jirafa come hojas de los árboles");
42+
}
43+
44+
@Override
45+
public void nadar() {
46+
throw new UnsupportedOperationException("La jirafa no puede nadar");
47+
}
48+
}
49+
50+
static class Pato implements Animal {
51+
@Override
52+
public void comer() {
53+
System.out.println("El pato come pan");
54+
}
55+
56+
@Override
57+
public void nadar() {
58+
System.out.println("El pato nada en el agua");
59+
}
60+
}
61+
62+
/*
63+
En este caso, la clase Jirafa no puede nadar, por lo que se lanza una excepción UnsupportedOperationException.
64+
Esto viola el principio de sustitución de Liskov, ya que la clase Jirafa no puede ser sustituida por la clase Animal.
65+
Para solucionar este problema, se puede crear una interfaz separada para los animales que pueden nadar, y hacer que la clase Pato implemente esa interfaz. Mientras que la clase Jirafa no implementará la interfaz AnimalAcuatico, pero sí la interfaz Animal.
66+
*/
67+
68+
interface Animal2 {
69+
void comer();
70+
}
71+
72+
interface AnimalAcuatico extends Animal2 {
73+
void nadar();
74+
}
75+
76+
static class Jirafa2 implements Animal2 {
77+
@Override
78+
public void comer() {
79+
System.out.println("La jirafa come hojas de los árboles");
80+
}
81+
}
82+
83+
static class Pato2 implements AnimalAcuatico {
84+
@Override
85+
public void comer() {
86+
System.out.println("El pato come pan");
87+
}
88+
89+
@Override
90+
public void nadar() {
91+
System.out.println("El pato nada en el agua");
92+
}
93+
}
94+
95+
/*
96+
DIFICULTAD EXTRA (opcional):
97+
Crea una jerarquía de vehículos. Todos ellos deben poder acelerar y frenar, así como cumplir el LSP.
98+
Instrucciones:
99+
1. Crea la clase Vehículo.
100+
2. Añade tres subclases de Vehículo.
101+
3. Implementa las operaciones "acelerar" y "frenar" como corresponda.
102+
4. Desarrolla un código que compruebe que se cumple el LSP.
103+
*/
104+
105+
abstract static class Vehiculo {
106+
abstract void acelerar();
107+
abstract void frenar();
108+
}
109+
110+
static class VehiculoDeportivo extends Vehiculo {
111+
@Override
112+
void acelerar() {
113+
System.out.println("El vehículo deportivo acelera rápidamente");
114+
}
115+
116+
@Override
117+
void frenar() {
118+
System.out.println("El vehículo deportivo frena bruscamente");
119+
}
120+
}
121+
122+
static class VehiculoFamiliar extends Vehiculo {
123+
@Override
124+
void acelerar() {
125+
System.out.println("El vehículo familiar acelera suavemente");
126+
}
127+
128+
@Override
129+
void frenar() {
130+
System.out.println("El vehículo familiar frena de forma segura");
131+
}
132+
}
133+
134+
static class VehiculoCarga extends Vehiculo {
135+
@Override
136+
void acelerar() {
137+
System.out.println("El vehículo de carga acelera lentamente");
138+
}
139+
140+
@Override
141+
void frenar() {
142+
System.out.println("El vehículo de carga frena con precaución");
143+
}
144+
}
145+
146+
}

0 commit comments

Comments
 (0)