új módosító (C# referencia)
Deklarációs módosítóként használva a new
kulcsszó kifejezetten elrejti az alaposztályból öröklő tagot. Ha elrejt egy öröklött tagot, a tag származtatott verziója lecseréli az alaposztály verzióját. Ez azt feltételezi, hogy a tag alaposztály-verziója látható, mivel az már rejtve lenne, ha a tag megjelölése private
vagy bizonyos esetekben. internal
Bár a módosító használata nélkül elrejtheti vagy protected
elrejtheti public
a new
tagokat, a fordító figyelmeztetést kap. Ha new
kifejezetten el szeretne rejteni egy tagot, az letiltja ezt a figyelmeztetést.
A kulcsszóval new
létrehozhat egy típuspéldányt, vagy általános típuskényszerként is.
Az örökölt tag elrejtéséhez deklarálja a származtatott osztályban ugyanazzal a tagnévvel, és módosítsa a new
kulcsszóval. Példa:
public class BaseC
{
public int x;
public void Invoke() { }
}
public class DerivedC : BaseC
{
new public void Invoke() { }
}
Ebben a példában BaseC.Invoke
a rejtett DerivedC.Invoke
. A mezőre x
nincs hatással, mert nem rejti el hasonló név.
Az öröklés során elrejtett név az alábbi űrlapok egyikét használja:
Egy osztályban vagy szerkezetben bevezetett állandó, mező, tulajdonság vagy típus általában elrejti a nevét megosztó összes alaposztálytagot. Vannak különleges esetek. Ha például egy új, névvel
N
rendelkező mezőt nem visszavonható típusnak deklarál, és az alaptípus metódusnak deklarálódikN
, az új mező nem rejti el az alapdeklarációt a meghívás szintaxisában. További információ: A C# nyelv specifikációjának Tagkeresés szakasza.Az osztályban vagy szerkezetben bevezetett metódus elrejti azokat a tulajdonságokat, mezőket és típusokat, amelyek ezt a nevet az alaposztályban osztják meg. Emellett elrejti az azonos aláírású alaposztály-metódusokat is.
Egy osztályban vagy szerkezetben bevezetett indexelő elrejti az összes olyan alaposztály-indexelőt, amely ugyanazzal az aláírással rendelkezik.
Hiba mindkettőt és felülbírálást használni new
ugyanazon a tagon, mert a két módosítónak kölcsönösen kizáró jelentése van. A new
módosító létrehoz egy új tagot ugyanazzal a névvel, és az eredeti tag el van rejtve. A override
módosító kibővíti az örökölt tag implementációját.
new
A módosító olyan deklarációban való használata, amely nem rejt el öröklött tagokat, figyelmeztetést eredményez.
Példák
Ebben a példában egy alaposztály BaseC
és egy származtatott osztály ugyanazt a mezőnevet x
használja, DerivedC
amely elrejti az örökölt mező értékét. A példa a módosító new
használatát mutatja be. Azt is bemutatja, hogyan érheti el az alaposztály rejtett tagjait teljes névvel.
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
*/
Ebben a példában egy beágyazott osztály elrejt egy olyan osztályt, amelynek ugyanaz a neve az alaposztályban. A példa bemutatja, hogyan használható a módosító a new
figyelmeztető üzenet eltávolítására, és hogyan érheti el a rejtett osztálytagokat a teljes névvel.
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
*/
Ha eltávolítja a new
módosítót, a program továbbra is lefordítja és futtatja, de a következő figyelmeztetés jelenik meg:
The keyword new is required on 'MyDerivedC.x' because it hides inherited member 'MyBaseC.x'.
C# nyelvspecifikáció
További információ: A C# nyelv specifikációjának új módosító szakasza.