Modificatore new (Riferimenti per C#)
Se utilizzata come modificatore, la parola chiave new nasconde in modo esplicito un membro ereditato da una classe base. Quando si nasconde un membro ereditato, la versione derivata del membro sostituisce la versione della classe base. Sebbene sia possibile nascondere i membri senza l'utilizzo del modificatore new, questa operazione genera un avviso. Utilizzando new per nascondere in modo esplicito un membro, si evita di visualizzare tale avviso e viene segnalata la sostituzione con la versione derivata.
Per nascondere un membro ereditato, dichiararlo nella classe derivata utilizzando lo stesso nome, quindi modificarlo con il modificatore new. Di seguito è riportato un esempio.
public class BaseC
{
public int x;
public void Invoke() { }
}
public class DerivedC : BaseC
{
new public void Invoke() { }
}
In questo esempio BaseC.Invoke viene nascosto da DerivedC.Invoke. Il campo x non viene influenzato perché non è nascosto da un nome simile.
Un nome viene nascosto tramite ereditarietà nei seguenti casi:
Una costante, un campo, una proprietà o un tipo inserito in una classe oppure una struttura che nasconde tutti i membri della classe base con lo stesso nome.
Un metodo inserito in una classe oppure una struttura che nasconde, nella classe base, proprietà, campi e tipi con lo stesso nome. Vengono nascosti anche tutti i metodi della classe base con la stessa firma.
Un indicizzatore inserito in una classe oppure una struttura che nasconde tutti gli indicizzatori della classe base con la stessa firma.
Non è possibile utilizzare sia new sia override sullo stesso membro, in quanto i significati dei due modificatori si escludono reciprocamente. Il modificatore new crea un membro nuovo con lo stesso nome e fa sì che il membro originale venga nascosto. Il modificatore override estende l'implementazione per un membro ereditato.
L'utilizzo del modificatore new in una dichiarazione che non nasconde un membro ereditato genera un avviso.
Esempio
In questo esempio, la classe base BaseC e la classe derivata DerivedC utilizzano lo stesso nome di campo x, che nasconde il valore del campo ereditato. Nell'esempio viene illustrato l'utilizzo del modificatore new. e viene inoltre descritto come accedere ai membri nascosti della classe base utilizzando i relativi nomi completi.
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
*/
In questo esempio, una classe annidata nasconde una classe che nella classe base ha lo stesso nome. Viene illustrato come utilizzare il modificatore new per eliminare il messaggio di avviso e come accedere ai membri nascosti delle classi tramite i relativi nomi completi.
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 si rimuove il modificatore new, la compilazione e l'esecuzione del programma saranno comunque possibili, ma verrà visualizzato il messaggio di avviso riportato di seguito:
The keyword new is required on 'MyDerivedC.x' because it hides inherited member 'MyBaseC.x'.
Specifiche del linguaggio C#
Per ulteriori informazioni, vedere la Specifiche del linguaggio C#. La specifica del linguaggio è la fonte ufficiale per la sintassi e l'utilizzo di C#.
Vedere anche
Riferimenti
Parole chiave per operatori (Riferimenti per C#)
Modificatori (Riferimenti per C#)