Skip to content

Commit 6501ba8

Browse files
committed
Reto#28-swift
1 parent 92a2a8b commit 6501ba8

File tree

1 file changed

+162
-0
lines changed

1 file changed

+162
-0
lines changed
Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
import Foundation
2+
/*
3+
LSP liskov substitution principle
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 , T
6+
puede ser reemplazado con objetos de tipo S sin alterar el comportamiento esperado en el programa.
7+
8+
para mas informmacion
9+
escrito: https://www.arquitecturajava.com/el-principio-de-substitucion-de-liskov/
10+
video: https://youtu.be/JQX7wrCzxFA?si=fr3SxQXPWeg0qyfN
11+
*/
12+
13+
// ejemplo de lo que no debe se hacerce
14+
15+
class Person{
16+
var dni:String?
17+
var fullName:String
18+
var creditCard:String?
19+
20+
init(dni:String?,fullName:String,creditCard:String?) {
21+
self.dni = dni
22+
self.fullName = fullName
23+
self.creditCard = creditCard
24+
}
25+
26+
func realizePayment(){
27+
let dniPerson = self.dni ?? "dni is nil"
28+
let creditCardPerson = self.creditCard ?? "creditCard is nil"
29+
print("my dni is \(dniPerson) and payment with \(creditCardPerson) was done")
30+
}
31+
}
32+
// un niño no puede tener dni ni tarjeta y para no modificar la superclase se usa nil
33+
class Boy:Person{
34+
init(fullName:String) {
35+
super.init(dni: nil, fullName: fullName, creditCard: nil)
36+
}
37+
38+
override func realizePayment() {
39+
print("iam a boy icant dni and creditCard")
40+
41+
}
42+
}
43+
// lo que debe de hacerce
44+
45+
// la superclase people debe delegar comportamiento a alguna superclase
46+
class People {
47+
let name:String
48+
let lastName:String
49+
50+
init(name:String,lastName:String) {
51+
self.name = name
52+
self.lastName = lastName
53+
}
54+
}
55+
56+
// ahora la subclase adulto agrega objetos S que no son parte de la superclase y ahora ya no es necesario
57+
// que estos datos sean nulos ya que el adulto si cuenta con una tarjeta y dni
58+
class Adult:People{
59+
var dni:String
60+
var creditCard:String
61+
62+
init(name:String,lastName:String,dni:String,creditCard:String) {
63+
self.dni = dni
64+
self.creditCard = creditCard
65+
super.init(name: name, lastName: lastName)
66+
}
67+
68+
func realizePayment() {
69+
print("my dni is \(self.dni) and payment with \(self.creditCard) was done")
70+
}
71+
}
72+
73+
// ahora la subclase niño queda mas limpia y esta puede delegar e pago a las clase Adulto
74+
class Kid :People{
75+
var adult:Adult
76+
init(name:String,lastName:String,adul:Adult) {
77+
self.adult = adul
78+
super.init(name: name, lastName: lastName)
79+
}
80+
}
81+
82+
// probando la implementacion
83+
let adult = Adult(name: "jose", lastName: "perez", dni: "12345678", creditCard: "123456789")
84+
adult.realizePayment()
85+
86+
let kid = Kid(name: "rodolfo", lastName: "perez",adul: adult)
87+
kid.adult.realizePayment()
88+
89+
90+
// ejercicio extra
91+
// nuestra superclase vehiculo
92+
class Vehicle{
93+
var model :String
94+
var speed : Int
95+
96+
init(model:String,speed:Int) {
97+
self.model = model
98+
self.speed = speed
99+
}
100+
101+
func accelerate() {
102+
print("The \(self.model) is accelerating \(self.speed) km/h")
103+
}
104+
105+
func brake() {
106+
print("The \(self.model) is braking ")
107+
}
108+
109+
}
110+
111+
// creamos nuestras subclases
112+
class Car:Vehicle{
113+
override init(model:String,speed:Int) {
114+
super.init(model: model, speed: speed)
115+
}
116+
}
117+
118+
// como la clase truck necesita dejar su mercaderia estos nuevos objetos s no son parte de la superclase
119+
120+
enum Burden {
121+
case Grave , Fruit, Metal ,Rocks
122+
}
123+
124+
class Truck:Vehicle{
125+
var burden: Burden
126+
init(model:String,speed:Int,burd:Burden) {
127+
self.burden = burd
128+
super.init(model: model, speed: speed)
129+
}
130+
131+
func deliver() {
132+
print("The \(self.model) is delivering \(self.burden)")
133+
}
134+
}
135+
// la clase bote puede anclar en algun lado por lo tanto este metodo se agrega
136+
class Boot:Vehicle{
137+
override init(model:String,speed:Int) {
138+
super.init(model: model, speed: speed)
139+
}
140+
141+
func anchor() {
142+
print("The \(self.model) is anchoring in hawaii island")
143+
}
144+
}
145+
146+
147+
// comprobar que la clase principal puede ser consumida por sus subclases
148+
149+
func consumeVehicle(vehicle:Vehicle){
150+
vehicle.accelerate()
151+
vehicle.brake()
152+
}
153+
154+
let car = Car(model: "Bmw", speed: 120)
155+
let truck = Truck(model: "Scania", speed: 100, burd: .Grave)
156+
let boot = Boot(model: "Dometic", speed: 250)
157+
consumeVehicle(vehicle: car)
158+
consumeVehicle(vehicle: truck)
159+
consumeVehicle(vehicle: boot)
160+
truck.deliver()
161+
boot.anchor()
162+

0 commit comments

Comments
 (0)