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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Super DVD C# - Recursos de aprendizagens e vídeo aulas para C#
Curso Fundamentos da Programação Orientada a Objetos com VB .NET
C# - Classes Abstratas, Interface e Polimorfismo - Macoratti
NET - Usando padrões de projeto e princípios OOP na ... - Macoratti