Skip to content

Commit 2f424b5

Browse files
authored
Merge pull request mouredev#4905 from AmadorQuispe/aqh
#28 - JAVA
2 parents 85f1b7c + d153874 commit 2f424b5

File tree

1 file changed

+178
-0
lines changed

1 file changed

+178
-0
lines changed
Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
package com.amsoft.roadmap.example28;
2+
3+
/*
4+
El Principio de Substitución de Liskov es uno de los principios SOLID y hace referencia a cómo usamos
5+
la herencia de forma adecuada. El principio dice algo como lo siguiente si S es un subtipo de T ,
6+
T puede ser reemplazado con objetos de tipo S sin alterar el comportamiento esperado en el programa.
7+
* */
8+
public class Example28 {
9+
public static void main(String[] args) {
10+
Person person = new Child("Juan","2233 3333 3333 5555");
11+
Payable citizen = new Citizen("Amador","1111 2222 3333 4444");
12+
citizen.pay();
13+
14+
//EXTRA
15+
Vehicle car = new Car();
16+
Vehicle motorbike = new Motorbike();
17+
Vehicle truck = new Truck();
18+
TestVehicle testVehicle = new TestVehicle();
19+
testVehicle.accelerate(car);
20+
testVehicle.accelerate(motorbike);
21+
testVehicle.accelerate(truck);
22+
23+
testVehicle.brake(car);
24+
testVehicle.brake(motorbike);
25+
testVehicle.brake(truck);
26+
}
27+
}
28+
/*
29+
La clase Person, se viola el Principio de Sustitución de Liskov porque la subclase Child hereda el método pay()
30+
de Person, lo que permite que un objeto Child realice pagos, aunque lógicamente un niño no debería poder hacerlo.
31+
La solución propuesta introduce una interfaz Payable que define el método pay(), y solo la subclase Citizen
32+
implementa esta interfaz, mientras que Child no.
33+
Esto garantiza que solo los objetos de Citizen puedan realizar pagos, respetando así el LSP y asegurando que los
34+
objetos de Child no se comporten de manera inapropiada al sustituir objetos de la clase base Person.
35+
*/
36+
class Person {
37+
private String name;
38+
private String bankAccount;
39+
40+
public Person(String name, String bankAccount) {
41+
this.name = name;
42+
this.bankAccount = bankAccount;
43+
}
44+
public String getName() {
45+
return name;
46+
}
47+
48+
public void setName(String name) {
49+
this.name = name;
50+
}
51+
52+
public String getBankAccount() {
53+
return bankAccount;
54+
}
55+
56+
public void setBankAccount(String bankAccount) {
57+
this.bankAccount = bankAccount;
58+
}
59+
}
60+
interface Payable {
61+
void pay();
62+
}
63+
class Child extends Person {
64+
public Child(String name, String bankAccount) {
65+
super(name, bankAccount);
66+
}
67+
}
68+
class Citizen extends Person implements Payable {
69+
public Citizen(String name, String bankAccount) {
70+
super(name, bankAccount);
71+
}
72+
73+
@Override
74+
public void pay() {
75+
System.out.println(this.getName() + " pay with number account bank number " + this.getBankAccount());
76+
}
77+
}
78+
79+
/*VIOLA LSP*/
80+
/* class Person {
81+
private String name;
82+
private String bankAccount;
83+
84+
public Person(String name, String bankAccount) {
85+
this.name = name;
86+
this.bankAccount = bankAccount;
87+
}
88+
89+
public void pay(){
90+
System.out.println(name + " pay with number account bank number " + bankAccount);
91+
}
92+
93+
public String getName() {
94+
return name;
95+
}
96+
97+
public void setName(String name) {
98+
this.name = name;
99+
}
100+
101+
public String getBankAccount() {
102+
return bankAccount;
103+
}
104+
105+
public void setBankAccount(String bankAccount) {
106+
this.bankAccount = bankAccount;
107+
}
108+
}
109+
class Child extends Person {
110+
111+
public Child(String name, String bankAccount) {
112+
super(name, bankAccount);
113+
}
114+
115+
@Override
116+
public void pay() {
117+
throw new UnsupportedOperationException("Cannot pay");
118+
}
119+
}
120+
class Citizen extends Person {
121+
public Citizen(String name, String bankAccount) {
122+
super(name, bankAccount);
123+
}
124+
}*/
125+
126+
/*EXTRA*/
127+
class TestVehicle {
128+
public void accelerate(Vehicle vehicle){
129+
vehicle.accelerate();
130+
}
131+
public void brake(Vehicle vehicle){
132+
vehicle.brake();
133+
}
134+
}
135+
abstract class Vehicle {
136+
abstract void accelerate();
137+
abstract void brake();
138+
}
139+
140+
class Car extends Vehicle {
141+
142+
@Override
143+
void accelerate() {
144+
System.out.println("Acelerando el coche");
145+
}
146+
147+
@Override
148+
void brake() {
149+
System.out.println("Frenando el coche");
150+
}
151+
}
152+
153+
class Motorbike extends Vehicle{
154+
155+
@Override
156+
void accelerate() {
157+
System.out.println("Acelerando la motocicleta");
158+
}
159+
160+
@Override
161+
void brake() {
162+
System.out.println("Frenando la motocicleta");
163+
}
164+
}
165+
166+
class Truck extends Vehicle {
167+
168+
@Override
169+
void accelerate() {
170+
System.out.println("Acelerando el camión");
171+
}
172+
173+
@Override
174+
void brake() {
175+
System.out.println("Frenando el camión");
176+
}
177+
}
178+

0 commit comments

Comments
 (0)