new (Modificador, Referencia de C#)
Cuando se utiliza como modificador, la palabra clave new oculta explícitamente un miembro heredado de una clase base. Cuando oculta un miembro heredado, la versión derivada del miembro reemplaza a la versión de la clase base. Aunque puede ocultar miembros sin utilizar el modificador new, el resultado es una advertencia. Si utiliza new para ocultar explícitamente un miembro, suprime esta advertencia y documenta el hecho de que la versión derivada está concebida como un reemplazo.
Para ocultar un miembro heredado, declárelo en la clase derivada con el mismo nombre y modifíquelo con el modificador new. Por ejemplo:
public class BaseC
{
public int x;
public void Invoke() { }
}
public class DerivedC : BaseC
{
new public void Invoke() { }
}
En este ejemplo, DerivedC.Invoke oculta BaseC.Invoke. El campo x no se ve afectado porque no lo oculta un nombre similar.
La ocultación de nombres por medio de la herencia toma una de las siguientes formas:
Constante, campo, propiedad o tipo introducido en una clase o struct que oculta todos los miembros de la clase base con el mismo nombre.
Método introducido en una clase o struct que oculta propiedades, campos y tipos, con el mismo nombre, en la clase base. También oculta todos los métodos de la clase base con la misma firma.
Indizador introducido en una clase o struct que oculta todos los indizadores de la clase base con la misma firma.
Es un error utilizar new y override en el mismo miembro porque los dos modificadores tienen significados mutuamente excluyentes. El modificador new crea un nuevo miembro con el mismo nombre y oculta el miembro original. El modificador override amplía la implementación de un miembro heredado.
Si se utiliza el modificador new en una declaración que no oculta un miembro heredado, se genera una advertencia.
Ejemplo
En este ejemplo, una clase base, BaseC, y una clase derivada, DerivedC, utilizan el mismo nombre de campo, x, lo que oculta el valor del campo heredado. El ejemplo muestra el uso del modificador new. También muestra cómo obtener acceso a los miembros ocultos de la clase base mediante sus nombres completos.
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
*/
En este ejemplo, una clase anidada oculta una clase que tiene el mismo nombre en la clase base. El ejemplo muestra cómo utilizar el modificador new para eliminar el mensaje de advertencia y cómo obtener acceso a los miembros de la clase oculta mediante sus nombres completos.
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
*/
Si quita el modificador new, el programa seguirá compilándose y ejecutándose, pero aparecerá la siguiente advertencia:
The keyword new is required on 'MyDerivedC.x' because it hides inherited member 'MyBaseC.x'.
Especificación del lenguaje C#
Para obtener más información, vea la Especificación del lenguaje C#. La especificación del lenguaje es la fuente definitiva de la sintaxis y el uso de C#.
Vea también
Referencia
Palabras clave de operadores (Referencia de C#)
Modificadores (Referencia de C#)