novo modificador (Referência C#)
Quando usada como um 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 de classe base do membro é visível, pois já estaria oculta se fosse marcada como private
ou, em alguns casos, internal
. Embora você possa ocultar ou protected
membros sem usar o new
modificador, você recebe um aviso do public
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 ocultado por herança assume 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 que compartilham seu nome. Há casos especiais. Por exemplo, se você declarar que um novo campo com nome
N
tem um tipo que não é invocável e um tipo base declaraN
ser um método, o novo campo não oculta a declaração base na sintaxe de invocação. Para obter mais informações, consulte a seção Pesquisa de membros 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 o 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 fique oculto. O override
modificador estende a implementação para 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, BaseC
, e uma classe derivada, DerivedC
, usam o mesmo nome x
de 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 ocultos da classe 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 seção O novo modificador da especificação da linguagem C#.