Artigo


C#: Hiding through inheritance

28/10/2008

 Hiding through inheritance ocorre quando redeclaramos nomes nas classes ou strucs derivadas, e esses nomes existem na classe base. Estão inclusos: constantes, campos, propriedades, eventos, métodos e indexadores. Operadores nunca podem ser redeclarados com a mesma assinatura em uma classe derivada, portanto uma classe derivada nunca irá ocultar um operador da classe base. 

Observe o seguinte código:
 

    class Base

    {

        public void F()

        {

            Console.WriteLine("Método da classe Base"); 

        }

    }

 

    class DerivadaA : Base

    {       

        public void F()

        {

            Console.WriteLine("Método da classe DerivadaA");           

        }       

    }

 

 
Esse código, quando compilado, gera a seguinte warning: O método DerivadaA.F( ) está ocultando o método Base.F( ). Isso implica que se fizermos uma chamada ao método DerivadaA.F( )  o método Base.F( ) não será executado. Nenhum problema até o momento, exceto o warning (que pode lhe causar muita dor de cabeça)!
 
Agora, vamos inserir mais uma classe derivada, dessa vez derivando de DerivadaA:

 

    class DerivadaB : DerivadaA

    {

        public void G()

        {

            F();

        }

    }

 Quando chamarmos o método DerivadaB.G( ) será executado o método DerivadaA.F( ). Continuamos sem nenhuma novidade. Imagine agora uma situação em que deseja chamar o método DerivadaB.G( ) e o mesmo executar o método Base.F( ).

 
Isso é possível!
 
Primeiro deve-se adicionar o new antes da declaração do método DerivadaA.F( )

 

    class DerivadaA : Base

    {       

        new public void F()

        {

            Console.WriteLine("Método da classe DerivadaA");           

        }       

    }

 

 

Dessa forma, informamos ao compilador que realmente queremos ocultar o método na herança (hiding through inheritance) e o warning desaparecerá. Agora basta alterarmos o modificador de acesso do método para private:

 

    class DerivadaA : Base

    {       

        new private void F()

        {

            Console.WriteLine("Método da classe DerivadaA");           

        }       

    }

 

Pronto! Agora a chamada do método DerivadaB.G( ) irá executar o método Base.F( ).



Rafael Camargo da silva - rafaelcamargo_99@hotmail.com

Microsoft Student Partner Co-Lead, trabalha na fábrica de software da Politec-Goiânia, instrutor de tecnologias de desenvolvimento Microsoft na Supera Education Center. Trabalha com desenvolvimento de softwares a mais de 6 anos.



| | Mais


Comentários

Qual a sua opinião?
Faça o login no topo do site ou cadastre-se rapidamente.



2003-2009 DevGoiás.NET. Todos os direitos reservados.