کلمه کلیدی new وقتی به عنوان اصلاحگر (modifier) استفاده می شود، صریحا" یک عضو که از یک کلاس پایه ای به ارث رفته است را مخفی می کند. وقتی شما یک عضو ارثی را مخفی می کنید، نسخه مشتق شده ی عضو ، جایگزین نسخه کلاس پایه می شود. هرچند شما می توانید بدون استفاده از اصلاحگر new اعضا را مخفی کنید اما نتیجه آن یک اخطار از طرف کامپایلر است. اگر شما برای مخفی کرد یک عضو، صریحا" از new استفاده کنید، از این اخطار اجتناب شده و این حقیقت که نسخه مشتق شده نامزد جایگزینی است را مستند می کند.
برای مخفی کردن یک عضو ارثی، آن را در کلاس مشتق شده با یک نام یکسان اعلان کنید و آنرا با اصلاحگر new اصلاح کنید. برای مثال:
در این مثال، BaseC.Invoke توسط DerivedC.Invoke مخفی است. مخفی سازی روی فیلد x مؤثر واقع نمی شود ، به این دلیل که با یک نام مشابه مخفی نشده است.
مخفی سازی نام از طریق وراثت به یکی از حالت های زیر است:
- یک ثابت، فیلد، پراپرتی یا نوع که در یک کلاس یا ساختار (struct) معرفی شده، همه ی اعضای کلاس پایه را که نام یکسانی با آنها دارند را مخفی می کند.
- یک متد که در یک کلاس یا ساختار معرفی شده، پراپرتی ها ، فیلدها و نوع های موجود در کلاس پایه را که نام یکسانی با آن متد داشته باشند ، مخفی می کند. این متد همچنین تمام متدهای کلاس پایه را که امضای مشابهی دارند را مخفی می کند.
- یک شاخصگر (indexer) که در یک کلاس یا ساختار معرفی شده، همه indexer های موجود در کلاس پایه را که امضای مشابهی دارند را مخفی می کند.
استفاده همزمان new و override روی یک عضو، خطا محسوب می شود، زیرا این دو اصلاحگر بصورت متقابل معانی منحصربفردی دارند. اصلاحگر new یک عضو جدید با نام یکسان می سازد و باعث مخفی شدن عضو اصلی می شود. اصلاحگر override پیاده سازی یک عضو ارث بری شده را توسعه می دهد.
استفاده از اصلاحگر new در یک اعلان که عمل مخفی سازی یک عضو ارثی را انجام نمی دهد، تولید یک اخطار از سوی کامپایلر می کند.
مثال
در این مثال، یک کلاس پایه ای به نام BaseC و یک کلاس مشتق شده به نام DerivedC از یک فیلد یکسان به نام x استفاده می کنند که مقدار فیلد ارث بری شده را مخفی می کند. این مثال طرز استفاده اصلاحگر new را توضیح می دهد. همچنین چگونگی دسترسی به اعضای مخفی شده از کلاس پایه را با استفاده از نام کامل آنها (fully qualified name) ، را توضیح می دهد.
در این مثال، یک کلاس تودرتو ، کلاسی که نام مشابهی در کلاس پایه دارد را مخفی می کند. این مثال چگونگی استفاده از اصلاحگر new برای رفع پیام اخطار و چگونگی دسترسی به اعضای مخفی کلاس با استفاده از نام کامل را نشان می دهد.
اگر شما اصلاحگر new را حذف کنید، برنامه باز هم کامپایل شده و اجرا می شود، اما اخطار زیر را دریافت خواهید کرد:
The keyword new is required on 'MyDerivedC.x' because it hides inherited member 'MyBaseC.x'.az