C# - Conceitos : Construtor (revisitado) - III


Hoje vamos rever um conceito muito importante na linguagem C#: O Construtor. 

Continuando a segunda parte do artigo vamos apresentar outros conceitos importantes sobre construtores.

A herança é um conceito chave usado na programação orientada a objetos para descrever uma relação entre as classes. Por meio da herança uma classe copia ou herda todas as propriedades, atributos e métodos de uma outra classe, podendo assim estender sua funcionalidade.

A classe que cede os membros para a outra classe é chamada superclasse, classe pai ou classe base,e a classe que herda os membros da outra classe é chamada subclasse ou classe derivada;

A herança e os Construtores : a palavra-chave base

A palavra-chave base é usada para acessar membros de classe base de dentro de uma classe derivada. Assim podemos:

No exemplo, temos a classe base Pessoa e a classe derivada Aluno que sobrescreve o método chamado GeNome da classe base. Usando a palavra-chave base, é possível chamar o método GetNome da classe base, de dentro da classe derivada.

A classe Aluno herda da classe base Pessoa

Ao criar uma instância de Aluno o campo nota da classe Aluno e a seguir o campo nome da classe Pessoa serão inicializados

Ao invocar o método GetNome da classe Aluno, será invocado o método GetNome da classe Pessoa usando a classe base: base.GetNome()

O Resultado final é exibido a seguir :

Note que o método GetNome na classe Pessoa foi definido com o modificador virtual

Note também que usamos o modificador override para substituir o método GetNome na classe derivada

 

A herança e os Construtores : Construtores não são herdados

Em outras palavras, só porque uma classe base tem um construtor tomando uma determinada lista de parâmetros, isso não significa que uma classe derivada vai herdar esse construtor usando essa lista de parâmetros. 

Nota: Você pode fornecer um construtor com a mesma lista de parâmetros mas ele não herda o construtor da classe base.

A ClasseBase possui um construtor com um parâmetro inteiro

A classeDerivada que herda da ClasseBase possui um construtor sem parâmetros e invoca o construtor da classe base usando a palavra-chave base

Ao tentar invocar um construtor para ClasseDerivada que usa um parâmetro int obtemos uma mensagem de erro

'ClasseDerivada' does not contain a constructor that takes 1 arguments


Logo isso prova que a classe ClasseDerivada não herda o construtor da classe base ClasseBase
 

Podemos criar uma instância de ClasseDerivada usando o construtor sem parâmetros da classe:

Na figura vemos o fluxo de execução do código :

1- Criamos uma instância da classe ClasseDerivada usando o seu construtor sem parâmetros;

2- O construtor da classe base é invocado;

3- É impresso o texto : "Construtor da classe base : x= 10"

4- O construtor da classe derivada é executado e imprime no console: "Construtor da classe derivada"

Temos que :

  1. O construtor da classe base ClasseBase(int x) é executado primeiro;
  2. A seguir o construtor da classe derivada ClasseDerivada() é executado na sequência;

Vejamos agora o seguinte exemplo:

 

Na classe ClasseBase definimos dois construtores:
  • ClasseBase()
  • ClasseBase(int x)

Na classe ClasseDerivada definimos também dois construtores:

  • ClasseDerivada()
  • ClasseDerivada(int y) : base(valor)
 

Ao criar um objeto da classe derivada da seguinte forma :

A ordem da execução será a seguinte:

  1. O Construtor sem parâmetros da classe base será executado;
  2. A seguir o Construtor da classe derivada será executado;

Assim mesmo não fazendo nenhuma chamada explícita para o construtor da classe base nem pelo inicializador nem pela palavra-chave base, ele  ela ainda está sendo executado.

Esse é o comportamento normal do construtor na herança.

Você acha que seria uma boa idéia fazer com que os construtores fossem herdados ?

Na próxima parte do artigo vou continuar a falar sobre construtores...

Pegue o código do projeto aqui: CShp_Construtor2.zip

"E disse-lhe um: Senhor, são poucos os que se salvam? E ele lhe respondeu:
Porfiai por entrar pela porta estreita; porque eu vos digo que muitos procurarão entrar, e não poderão."

Lucas 13:23,24

Referências:


José Carlos Macoratti