1
+ #28 SOLID: PRINCIPIO DE SUSTITUCIÓN DE LISKOV (LSP)
2
+ """
3
+ /*
4
+ * EJERCICIO:
5
+ * Explora el "Principio SOLID de Sustitución de Liskov (Liskov Substitution Principle, LSP)"
6
+ * y crea un ejemplo simple donde se muestre su funcionamiento
7
+ * de forma correcta e incorrecta.
8
+ *
9
+ * DIFICULTAD EXTRA (opcional):
10
+ * Crea una jerarquía de vehículos. Todos ellos deben poder acelerar y frenar, así como
11
+ * cumplir el LSP.
12
+ * Instrucciones:
13
+ * 1. Crea la clase Vehículo.
14
+ * 2. Añade tres subclases de Vehículo.
15
+ * 3. Implementa las operaciones "acelerar" y "frenar" como corresponda.
16
+ * 4. Desarrolla un código que compruebe que se cumple el LSP.
17
+ */
18
+ """
19
+
20
+ '''
21
+ La L de SOLID alude al apellido de quien lo creó, Barbara Liskov, y dice que “las clases derivadas
22
+ deben poder sustituirse por sus clases base”.
23
+ '''
24
+
25
+ #Mal uso
26
+ class Ave :
27
+ def volar (self ):
28
+ return "El ave está volando"
29
+
30
+ class Pinguino (Ave ):
31
+ def volar (self ):
32
+ # Los pingüinos no pueden volar, pero al ser una subclase de Ave,
33
+ # nos vemos obligados a implementar este método de una forma ilógica.
34
+ raise Exception ("Los pingüinos no pueden volar" )
35
+
36
+ # Función que espera cualquier ave
37
+ def mover_ave (ave : Ave ):
38
+ return ave .volar ()
39
+
40
+ # Creamos un objeto de la clase Pinguino
41
+ pinguino = Pinguino ()
42
+
43
+ # Intentamos volar con el pingüino, pero causa un error
44
+ print (mover_ave (pinguino )) # Error: Los pingüinos no pueden volar
45
+
46
+ #Buen uso
47
+ class Ave :
48
+ def mover (self ):
49
+ return "El ave se está moviendo"
50
+
51
+ class AveVoladora (Ave ):
52
+ def volar (self ):
53
+ return "El ave está volando"
54
+
55
+ class Pinguino (Ave ):
56
+ def mover (self ):
57
+ return "El pingüino está nadando"
58
+
59
+ class Aguila (AveVoladora ):
60
+ def volar (self ):
61
+ return "El águila está volando alto"
62
+
63
+ # Función que puede aceptar cualquier tipo de ave para moverse
64
+ def mover_ave (ave : Ave ):
65
+ return ave .mover ()
66
+
67
+ # Función específica para aves voladoras
68
+ def volar_ave (ave : AveVoladora ):
69
+ return ave .volar ()
70
+
71
+ # Creamos un pingüino y un águila
72
+ pinguino = Pinguino ()
73
+ aguila = Aguila ()
74
+
75
+ # Llamamos a la función mover para ambas aves
76
+ print (mover_ave (pinguino )) # Salida: El pingüino está nadando
77
+ print (mover_ave (aguila )) # Salida: El ave se está moviendo
78
+
79
+ # Llamamos a la función volar solo para aves voladoras
80
+ print (volar_ave (aguila )) # Salida: El águila está volando alto
81
+
82
+ #Extra
83
+ class Vehiculo :
84
+ def acelerar ():
85
+ return f"El Vehiculo esta Acelerando"
86
+
87
+ def frenar ():
88
+ return f"El vehiculo esta Frenando"
89
+
90
+ class Moto (Vehiculo ):
91
+ def acelerar ():
92
+ return f"La Moto esta Acelerando"
93
+
94
+ def frenar ():
95
+ return f"La Moto esta Frenando"
96
+
97
+ class Carro (Vehiculo ):
98
+ def acelerar ():
99
+ return f"El Carro esta Acelerando"
100
+
101
+ def frenar ():
102
+ return f"El Carro esta Frenando"
103
+
104
+ class Bus (Vehiculo ):
105
+ def acelerar ():
106
+ return f"El Bus esta Acelerando"
107
+
108
+ def frenar ():
109
+ return f"El Bus esta Frenando"
110
+
111
+ moto = Moto
112
+ carro = Carro
113
+ bus = Bus
114
+
115
+ print (moto .acelerar ())
116
+ print (moto .frenar ())
117
+
118
+ print (carro .acelerar ())
119
+ print (carro .frenar ())
120
+
121
+ print (bus .acelerar ())
122
+ print (bus .frenar ())
0 commit comments