Skip to content

Commit f730703

Browse files
authored
Merge pull request #6990 from Hequebo/hequebo28
#28 - C#
2 parents 5eb7a1c + b915462 commit f730703

File tree

1 file changed

+267
-0
lines changed

1 file changed

+267
-0
lines changed

Roadmap/28 - SOLID LSP/c#/hequebo.cs

Lines changed: 267 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,267 @@
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

Comments
 (0)