Compartilhar via


novo modificador (Referência de C#)

Quando usada como modificador de declaração, a new palavra-chave oculta 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. Isso pressupõe que a versão da classe base do membro esteja visível, pois já estaria oculta se estivesse marcada como private ou, em alguns casos, internal. Embora você possa ocultar public ou protected membros sem usar o new modificador, você receberá um aviso do compilador. Se você usar new para ocultar explicitamente um membro, ele suprimirá esse aviso.

Você também pode usar a new palavra-chave para criar uma instância de um tipo ou como uma restrição de tipo genérico.

Para ocultar um membro herdado, declare-o na classe derivada usando o mesmo nome de membro e modifique-o com a 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 está oculto por DerivedC.Invoke. O campo x não é afetado porque não está oculto por um nome semelhante.

O nome oculto por meio da herança usa um dos seguintes formulários:

  • Em geral, uma constante, campo, propriedade ou tipo introduzido em uma classe ou struct 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 para ter um tipo que não seja invocado e um tipo base declarar N ser um método, o novo campo não ocultará a declaração base na sintaxe de invocação. Para obter mais informações, consulte a seção Pesquisa de membro da especificação da linguagem C#.

  • 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 de 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, pois 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 fique oculto. O override modificador estende a implementação de um membro herdado.

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

Exemplos

Neste exemplo, uma classe base, BaseCe uma classe derivada, DerivedCusam o mesmo nome xde campo, 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
*/

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 ocultos 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'.

Especificação da linguagem C#

Para obter mais informações, consulte a nova seção modificadora da especificação da linguagem C#.

Consulte também