Herança com construtores

Como já dito, no processo de herança somente o construtor sem parâmetros é herdado. O código de exemplo mostra o processo de uso dos construtores:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using System;
 
public class Base
{
      public Base()
      {
            Console.WriteLine("Estou no construtor da classe base");
      }
}
 
//declara a classe derivada herdando a classe base
public class Derivada: Base
{
      public Derivada()
      {
            Console.WriteLine("Estou no construtor da classe derivada");
      }
}
 
public class MinhaClasse
{
      static void Main()
      {
            // objeto da classe base executando o construtor
            Base minhaBase = new Base();
            // objeto da classe derivada executando o construtor
            Derivada minhaDerivada = new Derivada();
 
      }
}

Compile e veja a saída no console:

Note que o construtor sem parâmetros da classe base foi automaticamente herdado. O 1º texto se refere à criação do objeto “minhaBase” e os seguintes se referem à criação do objeto “minhaDerivada”. No momento da criação do objeto “minhaDerivada”, foram executados o construtor da classe base e o construtor da classe derivada. Se quisermos herdar os outros construtores, devemos criar um equivalente na classe derivada e evocar o construtor da classe base com a palavra chave “base” passando os parâmetros necessários. O código abaixo exemplifica a chamada de um construtor de classe base através da classe derivada:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
using System;
 
public class Base
{
      public Base()
      {
            Console.WriteLine("Estou no 1º construtor da classe base");
      }
      public Base(int valor)
      {
            Console.WriteLine("Estou no 2º construtor da classe base");
      }
}
 
public class Derivada: Base
{
      // declara o construtor da classe derivada herdando o construtor da classe base
      public Derivada(): base()
      {
            Console.WriteLine("Estou no 1º construtor da classe derivada");
      }
     // declara o construtor da classe derivada herdando o construtor da classe base. Como o construtor da classe base exige um parâmetro, este é passado no pelo lista de parâmetros do próprio contrutor
      public Derivada(int valor): base(valor)
      {
            Console.WriteLine("Estou no 2º construtor da classe derivada");
      }
}
 
public class MinhaClasse
{
      static void Main()
      {
            // objeto da classe base executando o 1º construtor
            Base minhaBase1 = new Base();
            // objeto da classe base executando o 2º construtor
            Base minhaBase2 = new Base(1);
            // objeto da classe derivada executando o 1º construtor
            Derivada minhaDerivada1 = new Derivada();
            // objeto da classe derivada executando o 2º construtor
            Derivada minhaDerivada2 = new Derivada(1);
      }
}

Compile e veja a saída no console:

As duas primeiras saídas se referem à criação do objeto “minhaBase1” e “minhaBase2”, as duas seguintes se referem à criação do objeto “minhaDerivada1”, e as duas últimas, ao objeto “minhaDerivada2”.

Construtores e Destrutores

Um construtor é um método ou ação que define o objeto na sua construção ou criação. Por que precisamos de um construtor? Porque no momento da criação de um objeto, precisamos definir quais as características que ele deverá ter.

É bom deixar claro aqui que uma classe não pode ser entendida como um objeto. Como dito anteriormente, uma classe define um objeto. Podemos entender, então, que “o objeto existe, mas a classe não”. Um objeto gato pode possuir pelos brancos, mas a classe gato não. A classe gato pode sim definir qual será a cor dos pelos do objeto gato criado, mas não ser acessada diretamente. (para alguns programadores mais experientes, pode ter surgido uma dúvida em relação aos membros estáticos, assunto que será tratado e esclarecido mais adiante)

Até podemos criar um objeto sem suas características definidas, mas você conseguiria definir este objeto? Imaginando uma classe gato que criará um objeto gato sem características definidas, tente imaginar o objeto gato sem cor, sem pelos, sem saber o que é andar, enfim. O construtor então é um método especial que é automaticamente executado quando um objeto de uma classe é criado. É no construtor então que devemos definir as características principais do objeto no momento de sua criação, podendo elas serem padrão ou serem informadas externamente.

Um destrutor faz exatamente o contrário, ou seja, define como o objeto deve ser descartado. Muitas vezes o destrutor é ignorado pelo fato da destruição ou do descarte de um objeto ser implícito, mas em alguns casos devem se tomar alguns cuidados como limpeza de rastros ou vínculos deixados ou implementados por este objeto, e são nestes que os destrutores são necessários.