Menu
Coddy logo textTech

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 ball

Uma 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
Rex

Somente 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 herdar

Coloque 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.0
challenge icon

Desafio

Fácil

Employee 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())")
quiz iconTeste seus conhecimentos

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

Pratique por conta própria: Playground de Swift