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 ballUna 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
RexSolo 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 heredarColoca 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.0Desafío
FácilEmployee 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())")
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
1Clases y objetos
Trabajar con archivosDefinir clasesMétodos y selfInicializadoresLas clases son referenciasRepaso: tarjeta de biblioteca4Encapsulación
Control de accesoSolo lectura desde fueraProtección del estadoInicializadores que pueden fallarRepaso - Cuenta bancaria7Polimorfismo y genéricos
PolimorfismoConversión de tiposFunciones genéricasTipos genéricosRepaso - Calculadora de formas2Structs y tipos por valor
StructsSemántica de valoresMétodos mutablesStruct o claseRepaso - elemento del inventario5Herencia
SubclasesSobrescritura de métodosInicializadores y superfinal y jerarquíasRepaso: jerarquía de empleados8Protocolos estándar
CustomStringConvertibleEquatableComparableHashableRepaso - Ordenamiento personalizado11Proyecto: Gestión de bibliotecas
Libros y miembrosPréstamo de librosPractica por tu cuenta: Playground de Swift