Compartir a través de


new (Modificador, Referencia de C#)

Cuando se utiliza como modificador de una declaración, la palabra clave new oculta explícitamente un miembro heredado de una clase base. Cuando se oculta un miembro heredado, la versión derivada del miembro reemplaza a la versión de la clase base. Aunque los miembros se pueden ocultar sin utilizar el modificador new, obtendrá una advertencia del compilador. Si utiliza new explícitamente para ocultar un miembro, se suprime esta advertencia.

Para ocultar un miembro heredado, declárelo en la clase derivada con el mismo nombre de miembro y modifíquelo con la palabra clave 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:

  • Normalmente, una constante, un campo, una propiedad o un tipo que se muestran en una clase o struct ocultan a todos los miembros de la clase base que comparten su nombre. Hay casos especiales. Por ejemplo, si declara un nuevo campo con el nombre N para tener un tipo que no es invocable y un tipo base declara N como método, el nuevo campo no oculta la declaración base en la sintaxis de invocación. Vea Especificación del lenguaje C# para obtener información detallada (vea la sección “Búsqueda de miembros” en la sección “Expresiones”).

  • Un método introducido en una clase o struct oculta las propiedades, los campos y los tipos que comparten el nombre en la clase base. También oculta todos los métodos de la clase base que tienen la misma signatura.

  • Un indizador introducido en una clase o struct oculta todos los indizadores de la clase base que tienen la misma signatura.

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, consulte 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 C#

Palabras clave de operadores (Referencia de C#)

Modificadores (Referencia de C#)

Control de versiones con las palabras clave Override y New (Guía de programación de C#)

Saber cuándo utilizar las palabras clave Override y New (Guía de programación de C#)

Conceptos

Guía de programación de C#

Otros recursos

Referencia de C#