Domina la herencia en Swift con un ejemplo claro y práctico: crea una superclase con propiedades y métodos comunes, y extiéndela con subclases que añaden comportamientos específicos. Así reutilizas código, evitas duplicidades y construyes jerarquías que escalan sin esfuerzo.
¿Qué es la herencia y por qué acelera tu desarrollo?
La herencia permite que una clase hija adquiera automáticamente las propiedades y métodos de su clase madre. Si necesitas una clase “igual pero con algo más”, la subclase hereda lo común y añade lo propio. En el ejemplo, Vehicle sirve como base para especializar en Bicycle y Tandem.
Superclase: define lo común a todos los tipos.
Subclase: hereda y agrega nuevas características.
Propiedad autocomputada: calcula su valor al accederse.
Beneficio clave: menos código repetido y más claridad.
¿Cómo se implementa la herencia con clases en Swift?
Partimos de un Playground nuevo y definimos una jerarquía simple. Observa cómo cada subclase amplía a la anterior sin reescribir lo ya hecho.
¿Cómo se define la superclase vehicle?
classVehicle{var currentSpeed:Double=0.0var description:String{return"viajando a \(currentSpeed) kilómetros por hora"}funcmakeNoise(){// do nothing: cada vehículo hará su propio ruido.}}let someVehicle =Vehicle()print(someVehicle.description)// "viajando a 0.0 kilómetros por hora"
Modela lo común: velocidad y description como propiedad autocomputada.
Prepara un método para especializar: makeNoise() sin implementación aquí.
¿Cómo hereda bicycle y añade propiedades?
classBicycle:Vehicle{var hasBasket:Bool=false}let bicycle =Bicycle()bicycle.hasBasket =truebicycle.currentSpeed =15print(bicycle.description)// "viajando a 15.0 kilómetros por hora"
Bicycle es “un vehículo con algo extra”: hasBasket.
Hereda currentSpeed, description y makeNoise() de Vehicle.
¿Cómo especializa tandem sobre bicycle?
classTandem:Bicycle{var currentNumberOfPassengers:Int=0}let tandem =Tandem()tandem.hasBasket =truetandem.currentNumberOfPassengers =2tandem.currentSpeed =22print(tandem.description)// "viajando a 22.0 kilómetros por hora"
Tandem hereda de Bicycle y agrega currentNumberOfPassengers.
Modifica propiedades heredadas y mantiene el acceso a description.
¿Qué jerarquías conviene practicar y qué habilidades desarrollas?
A partir de Vehicle, crea árboles de clases para un videojuego con distintos tipos de vehículos. Úsalos como ejercicio de diseño: define qué comparte el padre y qué añade cada hijo.
Desde Vehicle: coche, moto, barco, bicicleta.
Desde coche: Fórmula uno, coche de calle, tanqueta, furgoneta.
Desde moto: moto eléctrica, moto de gasolina, patineta.
Desde barco: transatlántico, yate, barquita de pesca.
Propiedades y métodos a considerar en los hijos.
Cilindrada y tipo de motor.
Tipo de combustible o capacidad eléctrica.
Acciones específicas: ruidos distintos en makeNoise().
Habilidades que refuerzas al practicar.
Modelar una jerarquía con clase madre e hijos.
Detectar atributos comunes vs. específicos.
Instanciar objetos y modificar propiedades heredadas.
Prepararte para sobrescribir variables y métodos más adelante.
¿Qué vehículos añadirías y qué propiedades los hacen únicos? Comparte ideas y casos de uso en comentarios.
He complementado este curso con la lectura de algunos libros, entre ellos tengo este: Sumergete en los patrones de diseño
Me ha ayudado a entender la POO
Una clase en Swift no puede heredar de múltiples clases a la vez, ya que Swift no soporta la herencia múltiple. Sin embargo, puedes lograr funcionalidad similar usando protocolos, que te permiten definir métodos y propiedades que pueden ser adoptados por diferentes clases. Esto permite a las clases implementar múltiples "interfaces" al mismo tiempo, aunque la herencia de clases en sí misma es simple y única.
Creo que la programación orientada a protocolos (POP) es la mejor opción a OOP.
son distintos paradigmas, si ves la POO o OOP se centra en la cantidad de clases que puedes crear para que tu código no se repita, me explico, que puedas construir clases para que el desarrollo sea mas rápido. Entonces mas allá de una mejor que otra es mas cuestión del uso y cada caso específico.
Estoy de acuerdo son paradigmas distintos y cada uno tiene sus ventajas dependiendo del contexto. Desde mi experiencia como desarrollador, he visto que OOP es muy útil para estructurar aplicaciones grandes con jerarquías claras, mientras que POP aporta mucha flexibilidad, sobre todo en proyectos donde buscamos modularidad y composición sobre herencia. Al final, creo que lo más importante es entender bien ambos enfoques para saber cuál aplicar según las necesidades específicas del proyecto.
Busque como, desde el hijo, sobrescribir una var que proviene del padre y descubrí ++override++
classVehicle{var currentSpeed =0.0var typeOfVehicle =""var color =""vardescription:String{return"Your \(typeOfVehicle):"} func makeNoise(){// emptyprint("El ruido depende del vehículo")}}classCar:Vehicle{varband:Stringvarversion:Stringvarpower:Stringvaryear:Intvardoors:Int override vardescription:String{return"\(typeOfVehicle): \(band) \(version). Model: \(year). Color: \(color), with \(doors) doors and \(power) Horse Power."}init(band:String,version:String,power:String,year:Int,doors:Int){ self.band= band
self.version= version
self.power= power
self.year= year
self.doors= doors
super.init()// Llama al inicializador de la clase base (Vehicle)}}classBicycle:Vehicle{// herenciavarmaterial:Stringvar hasBasket =false// basket = cestavarconditionBrakes:String override vardescription:String{return"\(typeOfVehicle): Material: \(material). Color: \(color). The brakes condition is \(conditionBrakes)."}init(material:String,hasBasket:Bool,conditionBrakes:String){ self.material= material
self.hasBasket= hasBasket
self.conditionBrakes= conditionBrakes
super.init()// Llama al inicializador de la clase base (Vehicle)}}let mustang =Car(band:"Ford Mustang",version:"5.0 Gt",power:"426",year:2017,doors:2)let bicy =Bicycle(material:"Aluminum",hasBasket:true,conditionBrakes:"good")mustang.typeOfVehicle="Car"mustang.color="White"bicy.color="blue"bicy.typeOfVehicle="Bicycle"bicy.conditionBrakes="good"print(mustang.description)// Car: Ford Mustang 5.0 Gt. Model: 2017. Color: White, with 2 doors and 426 Horse Power.print(bicy.description)// Bicycle: Material: Aluminum. Color: blue. The brakes condition is good.
Estuve un rato para hacerlo y resulta que lo explicaba en la siguiente clase jaja
reto terminado
classvehicle{var mark =""var model =""var year =0vardescription:String{return"vehiculo marca: \(mark), modelo: \(model), año: \(year), "}}classbicycle: vehicle{var passager =0var canasta =false}classAutoMovil: vehicle{var passager =0var type =""vardescriptionDetalle:String{return"pasajeros: \(passager), tipo de automovil: \(type)"}}//creando un teslaletTesla=AutoMovil()Tesla.mark="Tesla"Tesla.model="S"Tesla.year=2021Tesla.passager=4Tesla.type="Electrico"print("\(Tesla.description) \(Tesla.descriptionDetalle)")//creando un mazdaletMazda=AutoMovil()Mazda.mark="Mazda"Mazda.model="3"Mazda.year=2021Mazda.passager=2Mazda.type="combustible"print("\(Mazda.description) \(Mazda.descriptionDetalle)")//creando una bicicletalet bici =bicycle()bici.passager=1bici.mark="cremas"bici.model="tradicional"bici.year=2021bici.canasta=trueprint(bici.description)
Mola el ejemplo, pero solo un comentario, creo que sería más correcto llamar a la propiedad "mark" de Vehicle, como "brand"