Subclasses
Parte da seção Programação Orientada a Objetos do Journey de Swift da Coddy. Lição 22 de 57.
Herança permite que uma classe se baseie em outra. class Dog: Animal torna Dog uma subclasse da superclasse Animal: um cachorro tem todas as propriedades e métodos de um animal, além do que Dog adiciona:
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())Saída:
Rex is an animal
Rex fetches the ballUma subclasse que não adiciona propriedades armazenadas herda os inicializadores da superclasse, e é por isso que Dog(name:) funciona sem um init em Dog. A herança modela uma relação é-um: todo cachorro é um animal, portanto um Dog pode ser usado onde quer que um Animal seja esperado:
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) }Saída:
Tom
RexSomente classes permitem herança; structs e enums não podem herdar. Uma class tem no máximo uma superclasse, mas uma superclasse pode ter muitas subclasses, formando uma hierarquia:
class Vehicle { var wheels = 0 }
class Car: Vehicle { } // Car é um Vehicle
class Bike: Vehicle { } // Bike é um Vehicle
// struct Truck: Vehicle { } // erro: structs não podem herdarColoque na superclasse tudo o que todas as subclasses compartilham e apenas as diferenças em cada subclasse. Quando um tipo não é realmente um tipo do outro, a herança é a ferramenta errada; uma propriedade que contenha o outro tipo geralmente se encaixa melhor.
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())Saída:
a square
9.0Desafio
FácilEmployee armazena um name e um salary e possui um método raise(by:) que aumenta o salário por uma porcentagem (arredondada para baixo). Declare uma subclasse Manager que adicione uma propriedade armazenada reports (um array de nomes, vazio inicialmente) e um método addReport(_:), além de um método teamSize() que retorna o número de relatórios.
O código fornecido cria um gerente a partir da primeira linha (name,salary), adiciona cada nome seguinte como um relatório, concede um aumento de 10% e imprime Ada earns 5500 and leads 2.
Seu código deve ficar em Employee.swift e Manager.swift. main.swift contém o código fornecido de entrada/saída e não pode ser editado.
Experimente você mesmo
// Código de entrada/saída fornecido: mantenha-o 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 lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Classes e Objetos
Trabalhando com ArquivosDefinindo ClassesMétodos e selfInicializadoresClasses são ReferênciasRevisão - Cartão da Biblioteca4Encapsulamento
Controle de AcessoSomente Leitura ExternaProtegendo o EstadoInicializadores que Podem FalharRevisão - Conta Bancária7Polimorfismo e Genéricos
PolimorfismoConversão de TiposFunções GenéricasTipos GenéricosRevisão - Calculadora de Formas2Structs e Tipos de Valor
StructsSemântica de ValorMétodos MutáveisStruct ou ClasseRecapitulação - Item de Inventário5Herança
SubclassesSobrescrita de métodosInicializadores e superfinal e hierarquiasRecapitulação - Hierarquia de funcionários8Protocolos Padrão
CustomStringConvertibleEquatableComparableHashableRecapitulação - Ordenação Personalizada11Projeto: Gerenciamento de Biblioteca
Livros e MembrosEmpréstimo de LivrosPratique por conta própria: Playground de Swift