C# - Classe base, classe derivada e alguns conceitos básicos - II


 Neste artigo veremos os conceitos de classe base, derivada, a palavra-chave base, o modificador virtual , o modificador override e alguns conceitos básicos.

Continuando a primeira parte do artigo hoje vou apresentar o problema que ocorre ao chamar um método virtual no construtor de classe base que pode causar um comportamento inconsistente do aplicativo, já que você pode estar chamando o método de classe derivada antes de inicializar todas as propriedades desta classe.

Criando uma classe base e usando a herança com uma classe derivada

Vamos criar uma classe chamada ClasseBase que será a nossa classe base:

Superclasse ou classe base

A classe base ClasseBase possui a propriedade NomeBase e o método GetNome() usando a palavra-chave ou modificador virtual.

Nesta classe temos também um construtor que é usado para inicializar o valor da propriedade e chamar o método GetNome().

Vamos agora criar a classe ClasseDerivada que herda da classe base ClasseBase :

Subclasse ou classe derivada

A classe derivada ClasseDerivada herda de ClasseBase e terá acesso a seus métodos e propriedades públicas e/ou protected.

Esta classe possui uma propriedade NomeDerivada e esta substituindo o método GetNome() da classe base usando o modificador override.

Note que no construtor da classe derivada estamos chamando o construtor da classe base usando palavra-chave : base(nome)

Vamos analisar oque ocorre quando criamos uma instância da classe derivada passando um valor para o seu construtor.

No código criamos um objeto ou uma instância da classe ClasseDerivada e passamos o nome 'Macoratti' para o seu construtor:

No resultado final vemos que o método GetNome() da classe derivada foi chamado não exibindo nenhum valor.(null)

Mas como isso aconteceu !!!

Primeiro vamos entender qual foi o fluxo da execução do código:

1 - No método Main foi criado um objeto cd da classe ClasseDerivada que herda da classe base ClasseBase;

2 - O construtor da classe derivada foi invocado mas nesse construtor estamos usando a palavra-chave base(nome) para acessar a classe base. Logo o construtor da classe base será executado e isso vai ocorrer antes do bloco do construtor ser executado.

3 - Ao executar o construtor da classe base, o valor da propriedade NomeBase será inicializado com o valor 'Macoratti' e a seguir o método GetNome() será chamado;

4 - Ocorre que o método GetNome() que é chamado é o método da classe derivada , mas neste caso a propriedade NomeDerivada não foi inicializado e o seu valor será null;

Mas qual o motivo desse comportamento ?

O motivo do resultado obtido é que de acordo com a regra de execução, quando sobrescrevemos o método virtual na classe derivada e criamos um objeto desta classe, o método da classe derivada será executado.

Assim, quando o construtor da classe ClasseBase chamar o método GetNome(), o método GetNome() da classe derivada será executado.

Neste momento o construtor da classe ClasseDerivada ainda não foi executado e por isso a propriedade NomeDerivada não será inicializada tendo seu valor padrão como null.

Abaixo uma figura descrevendo o fluxo de execução :

Espero que você tenha entendido o problema...

Pegue o projeto aqui : CShp_ClasseBase.zip

"Não pergunteis, pois, que haveis de comer, ou que haveis de beber, e não andeis inquietos."
"Porque as nações do mundo buscam todas essas coisas; mas vosso Pai sabe que precisais delas."
"Buscai antes o reino de Deus, e todas estas coisas vos serão acrescentadas."
Lucas 12:29-31

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti