Lição: 19: Classes e Herança
Em Swift, classes são um bloco fundamental da programação orientada a objetos. Elas permitem a criação de estruturas de dados complexas que podem encapsular tanto dados quanto comportamentos. Nesta aula, nós exploraremos o conceito de classes e herança em Swift com exemplos práticos.
O que é uma Classe?
Uma classe em Swift é um modelo para criar objetos. Ela define propriedades (variáveis) e métodos (funções) que podem ser usados para manipular essas propriedades. As classes também suportam herança, permitindo que uma nova classe herde propriedades e métodos de uma classe existente.
Definindo uma Classe
Aqui está um exemplo simples de como definir uma classe em Swift:
class Veiculo {
var velocidade: Double
var nome: String
init(nome: String, velocidade: Double) {
self.nome = nome
self.velocidade = velocidade
}
func descrever() -> String {
return "O \(nome) se move a \(velocidade) km/h."
}
}
// Criando uma instância de Veiculo
let carro = Veiculo(nome: "Carro", velocidade: 120.0)
print(carro.descrever()) // Saída: O Carro se move a 120.0 km/h.
Neste exemplo, definimos uma classe Veiculo
com duas propriedades (velocidade
e nome
) e um método chamado descrever()
.
Herança
A herança permite que uma classe herde propriedades e métodos de outra. Isso promove a reutilização de código e estabelece uma relação hierárquica entre as classes.
Criando uma Subclasse
Para criar uma subclasse em Swift, use a palavra-chave class
seguida pelo nome da subclasse e um dois-pontos, seguido pelo nome da superclasse.
Aqui está um exemplo de uma subclasse chamada Carro
que herda da classe Veiculo
:
class Carro: Veiculo {
var numeroDePortas: Int
init(nome: String, velocidade: Double, numeroDePortas: Int) {
self.numeroDePortas = numeroDePortas
super.init(nome: nome, velocidade: velocidade)
}
override func descrever() -> String {
return "O \(nome) é um carro com \(numeroDePortas) portas e se move a \(velocidade) km/h."
}
}
// Criando uma instância de Carro
let meuCarro = Carro(nome: "Honda", velocidade: 150.0, numeroDePortas: 4)
print(meuCarro.descrever()) // Saída: O Honda é um carro com 4 portas e se move a 150.0 km/h.
Neste código, a classe Carro
herda da classe Veiculo
. Ela adiciona uma nova propriedade, numeroDePortas
, e sobrescreve o método descrever()
para fornecer detalhes adicionais específicos para carros.
Inicializadores em Subclasses
Ao criar uma subclasse, você pode definir inicializadores para configurar a nova classe. É necessário chamar o inicializador da superclasse usando super.init()
para garantir que as propriedades da superclasse sejam corretamente inicializadas.
Como mostrado no exemplo, o inicializador de Carro
chama super.init(nome:velocidade:)
para inicializar as propriedades nome
e velocidade
da classe Veiculo
.
Sobrescrita de Métodos
Em Swift, você pode sobrescrever métodos da superclasse para fornecer uma implementação personalizada na subclasse. Para fazer isso, use a palavra-chave override
, conforme demonstrado nos exemplos anteriores.
class Caminhao: Veiculo {
var capacidadeDeCarga: Double
init(nome: String, velocidade: Double, capacidadeDeCarga: Double) {
self.capacidadeDeCarga = capacidadeDeCarga
super.init(nome: nome, velocidade: velocidade)
}
override func descrever() -> String {
return "O \(nome) é um caminhão com capacidade de carga de \(capacidadeDeCarga) toneladas, se movendo a \(velocidade) km/h."
}
}
// Criando uma instância de Caminhao
let meuCaminhao = Caminhao(nome: "Freightliner", velocidade: 80.0, capacidadeDeCarga: 10.0)
print(meuCaminhao.descrever()) // Saída: O Freightliner é um caminhão com capacidade de carga de 10.0 toneladas, se movendo a 80.0 km/h.
A classe Caminhao
herda de Veiculo
e sobrescreve o método descrever()
para fornecer informações sobre sua capacidade de carga.
Conclusão
Classes e herança são recursos poderosos em Swift que permitem a criação de código complexo e reutilizável. Ao definir classes e usar herança, você pode modelar efetivamente entidades do mundo real e criar uma base de código bem estruturada. Nesta aula, abordamos os fundamentos das classes, subclasses, inicialização e sobrescrita de métodos.
Pratique criando suas próprias classes e subclasses para aprofundar sua compreensão desses conceitos!