ما هو الهدف من المعدل "الثابت الجديد" لوظيفة ما؟

StackOverflow https://stackoverflow.com/questions/661246

سؤال

اليوم ، وجدت شيئًا في الكود القديم. لديها "ثابت جديد" لوظيفة واحدة. تبدو هكذا.

class Foo
{
    public static void Do()
    {
        Console.WriteLine("Foo.Do");
    }
}

class Bar: Foo
{
    public static new void Do()
    {
        Console.WriteLine("Bar.Do");
    }
}

أنا لا أفهم جديد ثابت المعدل ل يفعل الطريقة في الفصل شريط. في C#، لا يمكن استدعاء الطريقة الثابتة إلا باسم الفصل بدلاً من اسم الكائن. لذلك ، لا أعتقد أن هناك أي فرق بين وجود "جديد" وليس.

بشكل عام ، إذا كان بعض بناء الجملة غير ضروري ، فإن C# مجرد علاجها. أي شخص لديه أي فكرة عن سبب سمح C# مثل هذا الجملة؟

هل كانت مفيدة؟

المحلول

إذا قمت بإزالة الجديد من الكود الخاص بك تحصل عليه:

تحذير CS0108: 'bar.do ()' مخففة العضو الموروث 'foo.do ()'. استخدام الكلمة الجديدة إذا كان المقصود الاختباء.

يحذرك برنامج التحويل البرمجي C# من أنك قد تفعل شيئًا لا تنويه ويطلب منك إدراج الجديد الكلمة الرئيسية لتأكيد أنك تعرف ما تفعله. إلى جانب قمع التحذير ، ليس له آثار أخرى.

نصائح أخرى

وهذا ينطبق فقط على المتصلين الخارجيين. تذكر أنه يمكنك استدعاء طريقة ثابتة للفئة الأساسية ، لذا فإن شيئًا مثل هذا صالح:

class Foo
{
    public static void Do() { Console.WriteLine("Foo.Do"); }
}
class Bar : Foo // :Foo added
{
    public static void Something()
    {
        Do();
    }
}

هذا هو السبب في أن التحذير يخبرك أن تضع الجديد ، فأنت تريد تجنب أي ارتباك عند القيام بذلك:

class Foo
{
    public static void Do() { Console.WriteLine("Foo.Do"); }
}
class Bar : Foo // :Foo added
{
    public static void Something()
    {
        Do();
    }
    public static new void Do() { Console.WriteLine("Bar.Do"); }
}

القي نظرة على هذه

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

مثالك ، لتوضيح الأمر ، يجب أن يكون

public class Foo
{
    public static void Do() {}
}
public class Bar :Foo
{
    public new static void Do() {}
}

في مثالك ، لا يبدو أن شريط الفئة الثانية يرث من فو. يبدو أن هذا خطأ مطبعي لأنه ليس من المنطقي خلاف ذلك.

على افتراض أنه خطأ مطبعي ، فإن المعدل "الجديد" يخفي صراحة إصدار الفئة الأساسية من الوظيفة Do(). هذا يعني أن النسخة المشتقة من Do() الطريقة بفعالية تحل محل إصدار الفئة الأساسية.

يوثق استخدام "جديد" هنا حقيقة أن الطريقة الموروثة تهدف إلى استبدال إصدار الفئة الأساسية من Do().

لمزيد من المعلومات، راجع المعدل الجديد (C#)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top