Modificador new (Referência de C#)

 

Quando usado como um modificador de declaração, o new palavra-chave oculta explicitamente um membro que é 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 new modificador, você obtém um aviso do compilador.  Se você usar new para ocultar explicitamente um membro, suprime o aviso.  

Para ocultar um membro herdado, declare-o na classe derivada usando o mesmo nome de membro e modificá-lo com o new palavra-chave.  Por exemplo:  

public class BaseC
{
    public int x;
    public void Invoke() { }
}
public class DerivedC : BaseC
{
    new public void Invoke() { }
}

Neste exemplo, BaseC.Invoke oculto por DerivedC.Invoke.  O campo x não é afetado porque ele não está oculto por um nome semelhante.  

Ocultação por meio da herança de nome escolhe uma das seguintes formas:

  • Em geral, uma constante, campo, propriedade ou tipo que é apresentado em uma classe ou estrutura oculta todos os membros da classe base que compartilham seu nome.  Há casos especiais.  Por exemplo, se você declarar um novo campo com nome N têm um tipo que não seja invocá-lo e um tipo base declara N para ser um método, o novo campo não oculta a declaração base na sintaxe de chamada.  Consulte o especificação da linguagem c# para obter detalhes (consulte a seção "Pesquisa de membro" na seção "Expressions").  

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

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

É um erro usar ambos new e substituir no mesmo membro, porque os dois modificadores têm significados mutuamente exclusivos.  O new modificador cria um novo membro com o mesmo nome e faz com que o membro original ficam ocultas.  O override modificador estende a implementação de um membro herdado.  

Usando o new modificador em uma declaração que não oculta um membro herdado gera um aviso.

Exemplo

Neste exemplo, uma classe base, BaseC, e uma classe derivada, DerivedC, use o mesmo nome do campo x, que oculta o valor do campo herdado.  O exemplo demonstra o uso do new modificador.  Ele também demonstra como acessar os membros ocultos da classe base usando seus nomes totalmente qualificados.  

public class BaseC
{
    public static int x = 55;
    public static int y = 22;
}

public class DerivedC : BaseC
{
    // Hide field 'x'.
    new public static int x = 100;

    static void Main()
    {
        // Display the new value of x:
        Console.WriteLine(x);

        // Display the hidden value of x:
        Console.WriteLine(BaseC.x);

        // Display the unhidden member y:
        Console.WriteLine(y);
    }
}
/*
Output:
100
55
22
*/

Exemplo

Neste exemplo, uma classe aninhada oculta uma classe que tem o mesmo nome na classe base.  O exemplo demonstra como usar o new modificador para eliminar a mensagem de aviso e como acessar os membros de classe oculta usando seus nomes totalmente qualificados.  

public class BaseC 
{
    public class NestedC 
    {
        public int x = 200;
        public int y;
    }
}

public class DerivedC : BaseC 
{
    // Nested type hiding the base type members.
    new public class NestedC   
    {
        public int x = 100;
        public int y; 
        public int z;
    }

    static void Main() 
    {
        // Creating an object from the overlapping class:
        NestedC c1  = new NestedC();

        // Creating an object from the hidden class:
        BaseC.NestedC c2 = new BaseC.NestedC();

        Console.WriteLine(c1.x);
        Console.WriteLine(c2.x);   
    }
}
/*
Output:
100
200
*/

Se você remover o new modificador, o programa ainda será compilado e executado, mas você receberá o seguinte aviso:

The keyword new is required on 'MyDerivedC.x' because it hides inherited member 'MyBaseC.x'.

Para obter mais informações, consulte a Especificação da linguagem C#. A especificação da linguagem é a fonte definitiva para a sintaxe e o uso de C#.

Mostrar: