Abstract

O conceito de contratos abstratos é utilizado para criar contratos que servem como modelos base para outros contratos, mas que não têm a intenção de serem implantados por si próprios. Um contrato é considerado abstrato se pelo menos uma de suas funções não possuir implementação completa dentro do contrato. Essa falta de implementação indica que o contrato está destinado a ser estendido por outros contratos que completarão essas implementações. Os contratos abstratos são uma ferramenta fundamental em Solidity, permitindo que os desenvolvedores definam interfaces e comportamentos comuns que podem ser compartilhados e estendidos por múltiplos contratos.

Características dos Contratos Abstratos

  • Funções sem implementar: A principal característica de um contrato abstrato é que ele contém pelo menos uma função sem uma implementação completa. Isso é indicado pela ausência do corpo da função (as chaves {}) e finalizando a declaração da função com um ponto e vírgula (;).

  • Herança: Os contratos abstratos são projetados para serem herdados por outros contratos. Um contrato que herda de um contrato abstrato deve implementar todas as funções não implementadas, a menos que o contrato também seja declarado como abstrato.

  • Palavra-chave **abstract**: É usada para declarar explicitamente um contrato como abstrato. A introdução dessa palavra-chave permite que os desenvolvedores comuniquem suas intenções de forma mais clara e evitem a implantação acidental de contratos incompletos.

  • Uso de **virtual** e **override**: No contexto de contratos abstratos, as funções não implementadas podem ser marcadas como virtual, e os contratos que herdam essas funções devem usar a palavra-chave override ao fornecer uma implementação, seguindo o sistema de herança e polimorfismo de Solidity.

Vejamos um exemplo abaixo:

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

abstract contract Animal {
    function makeSound() public virtual returns (string memory);
}

contract Dog is Animal {
    function makeSound() public pure override returns (string memory) {
        return "Woof";
    }
}

contract Cat is Animal {
    function makeSound() public pure override returns (string memory) {
        return "Meow";
    }
}

Neste exemplo, Animal é um contrato abstrato porque possui uma função, makeSound, sem implementação. A palavra-chave virtual indica que essa função está destinada a ser sobrescrita pelos contratos herdeiros. Os contratos Dog e Cat herdam de Animal e fornecem suas próprias implementações da função makeSound, utilizando a palavra-chave override para indicar que estão sobrescrevendo a função abstrata.

Last updated