Sobes.tech
Middle

Qual é a diferença entre protocolos e classes quando se trata de classes abstratas?

sobes.tech IA

Resposta da IA

O protocolo define um contrato: um conjunto de requisitos (métodos, propriedades, inicializadores) que um tipo deve implementar ao conformar-se a esse protocolo. Os protocolos não possuem implementação da maioria de seus requisitos. Não é possível criar instâncias de um protocolo.

Uma classe abstrata em linguagens diferentes de Swift (por exemplo, Java) representa uma classe que não pode ser instanciada diretamente. Ela contém métodos (ou propriedades) implementados, bem como métodos abstratos que devem ser implementados em suas subclasses.

Em Swift, não existe o conceito de classes abstratas em seu sentido tradicional. A funcionalidade de classes abstratas em Swift é alcançada por uma combinação de protocolos e classes.

Usando um protocolo, pode-se definir uma interface e depois criar uma classe normal que cumpra esse protocolo e forneça uma implementação. Uma implementação parcial do protocolo pode ser fornecida por meio de extensões (protocol extensions), mas isso não torna o protocolo uma "classe abstrata" em sua forma pura.

Protocolo (Swift) Classe abstrata (tradicional)
Propósito Definir um contrato (interface) Definir comportamento e estrutura comuns com possibilidade de implementação parcial
Implementação Geralmente, não contém implementação (exceto em extensões) Pode conter métodos implementados e abstratos
Instanciação Não é possível criar uma instância do protocolo Não é possível criar uma instância de uma classe abstrata diretamente
Herança Conformidade com o protocolo (conformance) Herança (inheritance)
Multiplicidade O tipo pode conformar-se a vários protocolos A classe pode herdar apenas de uma classe (na maioria das linguagens)
Em Swift É a principal forma de abstração Não há equivalente direto, é imitado com protocolos e classes

Exemplo de imitação de uma classe abstrata usando protocolo e classe em Swift:

Protocolo que define requisitos abstratos:

// Protocolo, como contrato
protocol Drawable {
    func draw()
    var color: String { get set }
}

Classe que conforma ao protocolo e fornece implementações:

// Classe que implementa o protocolo
class Circle: Drawable {
    var color: String

    init(color: String) {
        self.color = color
    }

    func draw() {
        print("Desenhando um círculo de cor \(color)")
    }
}

Extensão para fornecer uma implementação parcial padrão:

// Extensão para fornecer uma implementação padrão (não torna o protocolo uma classe abstrata)
extension Drawable {
    func draw() {
        print("Começando a desenhar algo de cor \(color)")
    }
}

Assim, em Swift, protocolos desempenham um papel fundamental na realização de polimorfismo e abstração, substituindo a concepção de classes abstratas de outras linguagens.