As classes abstratas são as que não permitem realizar qualquer tipo de instância. São classes feitas especialmente para serem modelos para suas classes derivadas. As classes derivadas, via de regra, deverão sobrescrever os métodos para realizar a implementação dos mesmos. As classes derivadas das classes abstratas são conhecidas como classes concretas.

Como medida de segurança, as classes abstratas somente podem ser estendidas, sendo que a criação de um objeto a partir da mesma é um procedimento evitado. Além disso, caso um ou mais métodos abstratos estejam presentes nessa classe abstrata, a classe filha será, então, forçada a definir tais métodos, pois, caso contrário, a classe filha também se tornará abstrata.

A funcionalidade dos métodos abstratos que são herdados pelas classes filha normalmente é atribuída de acordo com o objetivo ou o propósito dessas classes. É possível, porém, não atribuirmos uma funcionalidade a esses métodos abstratos. Neste caso, faz-se necessário, pelo menos, declarar tais métodos.

  • Métodos Abstratos – Os métodos abstratos estão presentes somente em classes abstratas, e são aqueles que não possuem implementação. A sintaxe deste tipo de método é a seguinte: abstract ;

Veja abaixo um exemplo de uma classe abstrata com um método abstrato (na próxima parte veremos um exemplo mais completo):

Abstract Class Pessoa

 
            {
                public string Nome;
                public int Idade;
                public string Email;
               
                  public abstract void Gravar();
               }
            

Desta forma podemos sobrescrever o método Gravar nas classes que serão derivadas da classe Pessoa:

 
class Funcionario : Pessoa
{
   public override void Gravar()
   {
      Nome = "Wellington";
      Idade = 21;
      Email = "wellingtonbalbo@gmail.com";
   }
}
            

Perceba que por meio da palavra-chave override (que apenas pode ser utilizada em métodos e atributos virtuais) sobrescrevemos o método Gravar, criado na classe Pessoa. Um método abstrato é implicitamente virtual.

Lembrando que podemos sobrescrever o método Gravar em mais classes (para quem acompanha meus artigos sobre o Consultório em Windows Forms, podem ver bem isso em ação).

Agora veremos um exemplo prático com Classes Abstratas. Acompanhem:

Crie um projeto do tipo ConsoleApplication, dando a ele o nome ExemploClassesAbstratas.

Poderíamos criar as classes direto no arquivo Program.cs, gerado automaticamente pelo Visual Studio e que contém o método Main, que define o ponto de entrada de nossa aplicação.

Mais como boas práticas vamos criar uma classe, dando a ela o nome Funcionario, que conterá a seguinte codificação:

 
public abstract class Funcionario
     {
         public string Nome;
         public decimal Salario;

         public abstract void Reajustar();
     }
            

Perceba que acrescentei a palavra-chave abstract na assinatura de minha classe, obrigatório para criarmos classes abstratas.

Repare que, como dito no artigo anterior, meu método abstrato não pode ter implementação, por isso não podemos criar seu corpo, usando chaves ({ e }), como num método comum. Se tentarmos usar chaves na criação do método e compilarmos, teremos o seguinte erro:

Mensagem de erro
Figura 1. Mensagem de erro.

O que traduzindo ao pé da letra seria algo como “o método Reajustar() não pode declarar um corpo porque está marcado como abstrato”.

Continuando com nosso exemplo, crie mais duas classes: Programador e Designer. Veja a seguir a codificação de cada uma:

 
public class Programador : Funcionario
     {
         public override void Reajustar()
         {
             Salario += 1000;
         }
     }
 public class Designer : Funcionario
     {
         public override void Reajustar()
         {
             Salario += 500;
         }
     }
            

Note a ação do Intellisense do Visual Studio, após digitarmos a palavra-chave override, perceba que ele já “entende” o método abstrato criado anteriormente e o disponibiliza para uso:

Método abstrato
Figura 2. Método abstrato.

Finalizando, vá ao Program.cs e, dentro do método Main, faça a seguinte codificação:

 
static void Main(string[] args)
         {
             Programador objProgramador = new Programador();
             Designer objDesigner = new Designer();

             objProgramador.Salario = 1300M;
             Console.WriteLine("Calculando Reajuste Programador\n");
             objProgramador.Reajustar();
             Console.WriteLine("Novo salário: " + objProgramador.Salario);

             objDesigner.Salario = 1100M;
             Console.WriteLine("\nCalculando Reajuste Designer\n");
             objDesigner.Reajustar();
             Console.WriteLine("Novo salário: " + objDesigner.Salario);

             Console.ReadKey();
         }
            

Perceba que foi bem simples o que fizemos acima, apenas instanciamos as classes, atribuímos um salário qualquer a sua variável Salario e executamos o método Reajustar, somando o valor vindo da classe com o que inserimos anteriormente.

Compilando a aplicação, o resultado é este:

Resultado do exemplo
Figura 3. Resultado do exemplo.