C# - Ocultamento de membros com a palavra chave new


 Este artigo trata do recurso do ocultamento de membros usando a palavra chave new na linguagem C#.

Quando usado como um modificador de declaração de um membro de uma classe, a palavra-chave new esconde explicitamente um membro herdado de uma classe base.

Quando você oculta um membro herdado, a versão derivada do membro substitui a versão da classe base. Embora você possa ocultar membros sem usar o novo modificador, você recebe um alerta do compilador.

Se você usar a palavra new para ocultar explicitamente um membro, ele suprime esta advertência do compilador.


Para ocultar um membro herdado basta declará-lo na classe derivada usando o mesmo nome modificando-o com a palavra chave new.


Exemplo:

 

public class Base
{
    public int x;
    public void Teste() { }
}

public class Derivada : Base
{
    new public void Teste() { }
}
Neste exemplo, Base.Teste está oculta por Derivada.Teste.

O campo x não é afetado porque ele não está oculto por um nome similar.
   

 

O ocultamento de Nome por herança tem uma das seguintes formas:

Geralmente, uma constante, campo, propriedade ou tipo que é introduzido em uma classe ou struct oculta todos os membros da classe base com o mesmo nome.

Um método introduzido em uma classe ou struct oculta propriedades, campos e tipos que compartilham esse nome na classe base. Ele também esconde todos os métodos de classe base que têm a mesma assinatura.

Um indexador introduzido em uma classe ou struct oculta todos os indexadores da classe base que têm a mesma assinatura.

É um erro usar a palavra new e override no mesmo membro, porque os dois modificadores têm significados mutuamente exclusivos.

O modificador new cria um novo membro com o mesmo nome e faz com que o membro original fique escondido. O modificador override estende a implementação de um membro herdado.

Usando o modificador new em uma declaração de que não oculta um membro herdado gera um alerta do compilador.

Vamos ver na prática como isso funciona...

Considere a hierarquia de classes abaixo:

A classe A  é a classe Pai ou SuperClasse ou classe Base

A classe B herda da classe A  (classe filha)

A classe C herda da classe B  (classe filha)

O método Teste() esta implementado na classe A e é herdado pelas classes B e C

Vejamos a implementação do código para este cenário no Visual Studio 2013 Express for Windows Desktop (pode ser testado em qualquer versão do Visual Studio)

Criando um projeto do tipo Console Application podemos fazer a seguinte implementação:

using System;
namespace CSharp_Polimorfismo1
{
    class ClasseA
    {
        public void Teste()
        {
            Console.WriteLine("ClasseA : método Teste()");
        }
    }
    class ClasseB : ClasseA
    {
    }
    class ClasseC : ClasseB
    {
    }
}

Vamos testar o  código acima na classe Program usando o código a seguir e visualizar o resultado esperado mostrado na figura ao lado:

using System;
namespace CSharp_Polimorfismo1
{
    class Program
    {
        static void Main(string[] args)
        {
            ClasseA a = new ClasseA();
            a.Teste();    // saida --> "ClasseA : método Teste()"
            ClasseB b = new ClasseB();
            b.Teste();    // saida --> "ClasseA : método Teste()"
            ClasseC c = new ClasseC();
            c.Teste();    // saida --> "ClasseA : método Teste()"
            Console.ReadKey();
        }
    }
}

Temos o comportamento esperado onde os objetos b e c acessam o método herdado da classe ClasseA.

Vamos então implementar o método Teste() nas demais classes.

using System;
namespace CSharp_Polimorfismo1
{
    class ClasseA
    {
        public void Teste()
        {
            Console.WriteLine("ClasseA : método Teste()");
        }
    }
    class ClasseB : ClasseA
    {
        public void Teste()
        {
            Console.WriteLine("ClasseB : método Teste()");
        }
    }
    class ClasseC : ClasseB
    {
        public void Teste()
        {
            Console.WriteLine("ClasseC : método Teste()");
        }
    }
}

Quando compilamos o código acima iremos obter um alerta do compilador conforme mostra a figura abaixo:

Mesmo assim podemos testar novamente usando o código a seguir na classe Program:

using System;
namespace CSharp_Polimorfismo1
{
    class Program
    {
        static void Main(string[] args)
        {
            ClasseA a = new ClasseA();
            ClasseB b = new ClasseB();
            ClasseC c = new ClasseC();
            a.Teste();   // saida --> "ClasseA : método Teste()"
            b.Teste();   // saida --> "ClasseB : método Teste()"
            c.Teste();   // saida --> "ClasseC : método Teste()"
            a = new ClasseB();
            a.Teste();   // saida --> "ClasseA : método Teste()"
            b = new ClasseC();
            b.Teste();   // saida --> "ClasseB : método Teste()"
            Console.ReadKey();
        }
    }
}

Para que os alertas sejam removidos basta seguir o conselho do compilador e usar a palavra new nos métodos das classes ClasseB e ClasseC:

 class ClasseB : ClasseA
    {
        new public void Teste()
        {
            Console.WriteLine("ClasseB : método Teste()");
        }
    }
  class ClasseC: ClasseB 
    {
        new public void Teste()
        {
            Console.WriteLine("ClasseC : método Teste()");
        }
    }

As regras que regem as declarações de um operador tornam impossível para uma classe derivada para declarar um operador com a mesma assinatura que um operador em uma classe base. Assim, os operadores não ocultam outro operador.

João 5:28 Não vos admireis disso, porque vem a hora em que todos os que estão nos sepulcros ouvirão a sua voz e sairão:

João 5:29 os que tiverem feito o bem, para a ressurreição da vida, e os que tiverem praticado o mal, para a ressurreição do juízo.

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 ?

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter
 

Referências:


José Carlos Macoratti