ما هو الهدف من المعدل "الثابت الجديد" لوظيفة ما؟
-
20-08-2019 - |
سؤال
اليوم ، وجدت شيئًا في الكود القديم. لديها "ثابت جديد" لوظيفة واحدة. تبدو هكذا.
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#)