1
+ /*
2
+ * El principio de sustitución de Liskov (LSP)
3
+ * establece que los objetos de una clase padre
4
+ * deben poder ser reemplazados por objetos de
5
+ * clases hijas sin alterar la integridad del
6
+ * programa
7
+ */
8
+ class Program
9
+ {
10
+ static void Main ( string [ ] args )
11
+ {
12
+ Console . WriteLine ( "---Principio de Sustitución de Liskov---" ) ;
13
+ // Incorrecto
14
+ AbstractSale sale = new Sale ( 500 ) ;
15
+ sale . Generate ( ) ;
16
+ Console . WriteLine ( $ "El impuesto es de ${ sale . CalculateTax ( ) } ") ;
17
+ Console . WriteLine ( $ "El total es de ${ sale . GetTotal ( ) } ") ;
18
+ Console . WriteLine ( ) ;
19
+
20
+ AbstractSale saleWithoutTax = new SaleWithoutTax ( 500 ) ;
21
+ saleWithoutTax . Generate ( ) ;
22
+ /*
23
+ * Si se intenta ejecutar estos métodos el sistema se
24
+ * rompe por lo que se rompería el principio de sustutución de Liskov
25
+ */
26
+ // Console.WriteLine($"El impuesto es de ${saleWithoutTax.CalculateTax()}");
27
+ // Console.WriteLine($"El total es de ${saleWithoutTax.GetTotal()}");
28
+ Console . WriteLine ( ) ;
29
+ // Correcto
30
+
31
+ SaleWithTaxes localSale = new LocalSale ( 500 ) ;
32
+ localSale . Generate ( ) ;
33
+ Console . WriteLine ( $ "El impuesto es de ${ localSale . CalculateTax ( ) } ") ;
34
+ Console . WriteLine ( $ "El total es de ${ localSale . GetTotal ( ) } ") ;
35
+ Console . WriteLine ( ) ;
36
+
37
+ AbstractSaleLSP saleLSP = new SaleWithoutTaxes ( 500 ) ;
38
+ saleLSP . Generate ( ) ;
39
+ Console . WriteLine ( ) ;
40
+
41
+ // Ejercicio extra
42
+ Console . WriteLine ( "---Ejercicio Extra---" ) ;
43
+ Vehicle car = new Car ( 50 ) ;
44
+ car . Accelerate ( 15 ) ;
45
+ car . Brake ( 5 ) ;
46
+ Console . WriteLine ( ) ;
47
+
48
+ Vehicle moto = new Motorcycle ( 40 ) ;
49
+ moto . Accelerate ( 20 ) ;
50
+ moto . Brake ( 30 ) ;
51
+ Console . WriteLine ( ) ;
52
+
53
+ Vehicle truck = new Truck ( 80 ) ;
54
+ truck . Accelerate ( 30 ) ;
55
+ truck . Brake ( 110 ) ;
56
+
57
+ Console . ReadLine ( ) ;
58
+ }
59
+ }
60
+ // Incorecto
61
+ /*
62
+ * Creamos una clase padre para ventas
63
+ * con tres campos para el importe, el
64
+ * impuesto y el total y tres métodos
65
+ * para generar la venta, calcular el
66
+ * impuesto y obtener el total
67
+ */
68
+ abstract class AbstractSale
69
+ {
70
+ protected decimal _amount ;
71
+ protected decimal _tax ;
72
+ protected decimal _total ;
73
+
74
+ public abstract void Generate ( ) ;
75
+ public abstract decimal CalculateTax ( ) ;
76
+ public abstract decimal GetTotal ( ) ;
77
+ }
78
+
79
+ /*
80
+ * Se crea una clase hija la cual
81
+ * implementa los metodos de la clase
82
+ * padre
83
+ */
84
+ class Sale : AbstractSale
85
+ {
86
+ public Sale ( decimal amount )
87
+ {
88
+ _amount = amount ;
89
+ }
90
+ public override void Generate ( )
91
+ {
92
+ Console . WriteLine ( "Se genera venta" ) ;
93
+ }
94
+ public override decimal CalculateTax ( )
95
+ {
96
+ _tax = _amount * 0.16m ;
97
+ return _tax ;
98
+ }
99
+ public override decimal GetTotal ( )
100
+ {
101
+ _total = _amount + _tax ;
102
+ return _total ;
103
+ }
104
+ }
105
+ /*
106
+ * Se crea una segunda clase la cual
107
+ * está pensada para no calcular
108
+ * impuestos, por lo que al no tener
109
+ * una implementación de estos métodos
110
+ * se arrojará una excepción
111
+ */
112
+ class SaleWithoutTax : AbstractSale
113
+ {
114
+ public SaleWithoutTax ( decimal amount )
115
+ {
116
+ _amount = amount ;
117
+ }
118
+
119
+ public override void Generate ( )
120
+ {
121
+ Console . WriteLine ( "Se genera venta sin Impuestos" ) ;
122
+ }
123
+ public override decimal CalculateTax ( )
124
+ {
125
+ throw new NotImplementedException ( ) ;
126
+ }
127
+ public override decimal GetTotal ( )
128
+ {
129
+ throw new NotImplementedException ( ) ;
130
+ }
131
+ }
132
+
133
+ // Correcto
134
+ /*
135
+ * Se crea la clase padre con lo mínimo que
136
+ * necesita una venta, en este ejemplo el monto
137
+ * y el método generar
138
+ */
139
+ abstract class AbstractSaleLSP
140
+ {
141
+ protected decimal _amount ;
142
+ public abstract void Generate ( ) ;
143
+ }
144
+ /*
145
+ * Podemos crear una segunada clase abstracta
146
+ * que incluya el impuesto y un metodo que lo
147
+ * genere, esta a su vez hereda de la clase
148
+ * AbstractSaleLSP
149
+ */
150
+ abstract class SaleWithTaxes : AbstractSaleLSP
151
+ {
152
+ protected decimal _tax ;
153
+ protected decimal _total ;
154
+
155
+ public abstract decimal CalculateTax ( ) ;
156
+ public abstract decimal GetTotal ( ) ;
157
+ }
158
+ /*
159
+ * La clase LocalSale hereda de la clase SaleWithTaxes
160
+ * y a su ves de AbstractSaleLSP por lo que implementa
161
+ * todos los métodos que tiene estas clases padre
162
+ */
163
+ class LocalSale : SaleWithTaxes
164
+ {
165
+ public LocalSale ( decimal amount )
166
+ {
167
+ _amount = amount ;
168
+ }
169
+ public override void Generate ( )
170
+ {
171
+ Console . WriteLine ( "Se genera la venta con impuestos" ) ;
172
+ }
173
+ public override decimal CalculateTax ( )
174
+ {
175
+ _tax = _amount * 0.16m ;
176
+ return _tax ;
177
+ }
178
+ public override decimal GetTotal ( )
179
+ {
180
+ _total = _amount + _tax ;
181
+ return _total ;
182
+ }
183
+ }
184
+ /*
185
+ * Ahora podemos crear una clase que solo herede de
186
+ * AbstractSaleLSP por lo que solo debe de implementar
187
+ * el método Generate()
188
+ */
189
+ class SaleWithoutTaxes : AbstractSaleLSP
190
+ {
191
+ public SaleWithoutTaxes ( decimal amount )
192
+ {
193
+ _amount = amount ;
194
+ }
195
+ public override void Generate ( ) => Console . WriteLine ( "Se genera venta sin impuestos" ) ;
196
+ }
197
+
198
+ // Ejercicio Extra
199
+ class Vehicle
200
+ {
201
+ public int Speed ;
202
+ public Vehicle ( int speed )
203
+ {
204
+ Speed = speed ;
205
+ }
206
+
207
+ public virtual void Accelerate ( int speed ) => Speed += speed ;
208
+ public virtual void Brake ( int speed )
209
+ {
210
+ Speed += speed ;
211
+ if ( Speed > 0 )
212
+ Speed = 0 ;
213
+ }
214
+ }
215
+ class Car : Vehicle
216
+ {
217
+ public Car ( int speed ) : base ( speed ) { }
218
+ public override void Accelerate ( int speed )
219
+ {
220
+ Console . WriteLine ( "El auto acelera" ) ;
221
+ base . Accelerate ( speed ) ;
222
+ Console . WriteLine ( $ "La velocidad del auto es de { Speed } km/h") ;
223
+ }
224
+ public override void Brake ( int speed )
225
+ {
226
+ Console . WriteLine ( "El auto frena" ) ;
227
+ base . Brake ( speed ) ;
228
+ if ( Speed == 0 )
229
+ Console . WriteLine ( "El auto se ha detenido por completo" ) ;
230
+ }
231
+ }
232
+
233
+ class Motorcycle : Vehicle
234
+ {
235
+ public Motorcycle ( int speed ) : base ( speed ) { }
236
+ public override void Accelerate ( int speed )
237
+ {
238
+ Console . WriteLine ( "La moto acelera" ) ;
239
+ base . Accelerate ( speed ) ;
240
+ Console . WriteLine ( $ "La velocidad de la moto es de { Speed } km/h") ;
241
+ }
242
+ public override void Brake ( int speed )
243
+ {
244
+ Console . WriteLine ( "La moto frena" ) ;
245
+ base . Brake ( speed ) ;
246
+ if ( Speed == 0 )
247
+ Console . WriteLine ( "La moto se ha detenido por completo" ) ;
248
+ }
249
+ }
250
+
251
+ class Truck : Vehicle
252
+ {
253
+ public Truck ( int speed ) : base ( speed ) { }
254
+ public override void Accelerate ( int speed )
255
+ {
256
+ Console . WriteLine ( "El camión acelera" ) ;
257
+ base . Accelerate ( speed ) ;
258
+ Console . WriteLine ( $ "La velocidad del camión es de { Speed } km/h") ;
259
+ }
260
+ public override void Brake ( int speed )
261
+ {
262
+ Console . WriteLine ( "El camión frena" ) ;
263
+ base . Brake ( speed ) ;
264
+ if ( Speed == 0 )
265
+ Console . WriteLine ( "El camión se ha detenido por completo" ) ;
266
+ }
267
+ }
0 commit comments