Menu
Coddy logo textTech

Subclases

Parte de la sección Programación orientada a objetos del Journey de Swift de Coddy. Lección 22 de 57.

La herencia permite que una clase se base en otra. class Dog: Animal convierte a Dog en una subclase de la superclase Animal: un perro tiene todas las propiedades y métodos de un animal, además de lo que añade Dog:

class Animal {
    var name: String
    init(name: String) { self.name = name }
    func describe() -> String { "\(name) is an animal" }
}

class Dog: Animal {
    func fetch() -> String { "\(name) fetches the ball" }
}

let rex = Dog(name: "Rex")
print(rex.describe())
print(rex.fetch())

Salida:

Rex is an animal
Rex fetches the ball

Una subclase que no añade propiedades almacenadas hereda los inicializadores de la superclase, por eso Dog(name:) funciona sin un init en Dog. La herencia modela una relación es-un: todo perro es un animal, por lo que un Dog puede usarse donde se espera un Animal:

class Animal {
    var name: String
    init(name: String) { self.name = name }
}

class Cat: Animal {}
class Dog: Animal {}

let pets: [Animal] = [Cat(name: "Tom"), Dog(name: "Rex")]
for pet in pets { print(pet.name) }

Salida:

Tom
Rex

Solo las clases admiten herencia; las estructuras y las enumeraciones no pueden heredar. Una clase tiene como máximo una superclase, pero una superclase puede tener muchas subclases, formando una jerarquía:

class Vehicle { var wheels = 0 }
class Car: Vehicle { }        // Car es un Vehicle
class Bike: Vehicle { }       // Bike es un Vehicle
// struct Truck: Vehicle { }  // error: las structs no pueden heredar

Coloca en la superclase lo que comparten todas las subclases, y solo las diferencias en cada subclase. Cuando un tipo no es realmente una clase de otro, la herencia es la herramienta equivocada; una propiedad que contenga el otro tipo suele encajar mejor.

class Shape {
    var name: String
    init(name: String) { self.name = name }
    func label() -> String { "a \(name)" }
}

class Square: Shape {
    var side = 1.0
    func area() -> Double { side * side }
}

let s = Square(name: "square")
s.side = 3
print(s.label())
print(s.area())

Salida:

a square
9.0
challenge icon

Desafío

Fácil

Employee almacena un name y un salary, y tiene un método raise(by:) que aumenta el salario en un porcentaje (redondeado hacia abajo). Declara una subclase Manager que añada una propiedad almacenada reports (un array de nombres, vacío al principio), un método addReport(_:) y un método teamSize() que devuelva el número de informes.

El código proporcionado crea un manager a partir de la primera línea (name,salary), añade cada nombre posterior como informe, aplica un aumento del 10 % e imprime Ada earns 5500 and leads 2.

Tu código va en Employee.swift y Manager.swift. main.swift contiene el código de entrada/salida proporcionado y no se puede editar.

Pruébalo tú mismo

// Código de entrada/salida suministrado: déjalo tal como está
var input: [String] = []
while let line = readLine() { input.append(line) }
let head = input[0].split(separator: ",").map(String.init)
let boss = Manager(name: head[0], salary: Int(head[1])!)
for name in input.dropFirst() { boss.addReport(name) }
boss.raise(by: 10)
print("\(boss.name) earns \(boss.salary) and leads \(boss.teamSize())")
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación orientada a objetos

Practica por tu cuenta: Playground de Swift