المعدّل new (مرجع #C)

عند استخدامها كمعدّل، تعمل الكلمة الأساسية new على إخفاء عضو موروث من فئة أساسية. عند إخفاء عضو موروث تحل النسخة الموروثة من العضو محل نسخة الفئة الأساسية. على الرغم من أنك قادر على إخفاء الأعضاء بدون استخدام المعدّل new تكون نتيجة ذلك تحذير. إذا استخدمت new لإخفاء أحد الأعضاء يقوم ذلك على منع لتحذير ويقوم بتوثيق حقيقة أن النسخه الموروثة يُقصد بها أن تكون بديل للنسخة الأصلية.

لإخفاء عضو موروث قم بتصريحه في الفئة المشتقة مستخدماً نفس الاسم وقم بتعديلها مستخدماً المعدّل new. فعلى سبيل المثال:

public class BaseC
{
    public int x;
    public void Invoke() { }
}
public class DerivedC : BaseC
{
    new public void Invoke() { }
}

في هذا المثال، BaseC.Invoke تم إخفاؤها بواسطة DerivedC.Invoke. لم يتم التأثير على الحقل x لأنه غير مخفي بواسطة اسم مشابه.

إخفاء الاسم من خلال التوريث يأخذ أحد النماذج التالية:

  • أي ثابت أو حقل أو خاصية أو نوع يكون موجوداً في فئة أو بنية تخفي جميع أعضاء الفئة الأساسية التي تكون بنفس الاسم.

  • ويعمل الأسلوب الموجود في الفئة أو البنية على إخفاء الخصائص والحقول والأنواع التي تكون بنفس الاسم في الفئة الأساسية. أيضاً تقوم بإخفاء كل أساليب الفئة الأساسية ذات نفس التوقيع.

  • يقوم المفهرس الموجود في فئة أو بنية بإخفاء جميع مفهرسات الفئة الأساسية ذات نفس التوقيع.

من الخطأ استخدام كلا الكلمتين new و override على نفس العضو لأن المعدّلان لهما معاني خاصة تبادلية. ينشئ المعدّل new عضو جديد بنفس الاسم ويخفي العضو الأصلي. يقوم المعدّل override على توسيع تطبيق العضو الموروث.

استخدام المعدّل new في تعريف لا يخفي أعضاء موروثة يولد تحذير.

مثال

في هذا المثال, الفئة الأساسية BaseC والفئة المشتقة DerivedC تستخدمان نفس اسم الحقل x ويقوم ذلك على إخفاء قيمة الحقل الموروث. يوضح المثال استخدام المعدّل new. كما يوضح كيفية الوصول للأعضاء المخفية من الفئة الأساسية باستخدام أسمائها المؤهلة بشكل كامل.

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
*/

في هذا المثال، تخفي الفئة المتداخلة فئة لها نفس الاسم في الفئة الأساسية. يوضح المثال كيفية استخدام المعدّل new للتخلص من رسالة التحذير وكيفية الوصول إلى أعضاء الفئة المخفية باستخدام أسمائها المؤهلة بشكل كامل.

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
*/

إذا قمت بإزالة المعدّل new، لا تزال قادراً على التحويل البرمجي للبرنامج وتشغيله ولكن ستحصل على التحذير التالي:

The keyword new is required on 'MyDerivedC.x' because it hides inherited member 'MyBaseC.x'.

مواصفات لغة #C

لمزيد من المعلومات، راجع مواصفات لغة #C. مواصفات اللغة هي المصدر النهائي لبناء جملة C# واستخدامها.

راجع أيضًا:

المرجع

الكلمات الأساسية لـ #C

الكلمات الأساسية لعوامل التشغيل (مرجع #C)

المعدّلات (مرجع #C)

المبادئ

دليل البرمجة لـ #C

موارد أخرى

مرجع C#‎