Runtime: لم يتم استدعاء طريقة الواجهة العامة

تم إنشاؤها على ١٠ أغسطس ٢٠١٨  ·  3تعليقات  ·  مصدر: dotnet/runtime

تم اختبار نموذج التعليمات البرمجية على .NET 2/3/4 / 4.5 / 4.6.1 &. سلوك Net Core 2.1 هو نفسه للجميع ، لماذا يتم التعامل مع هذا على هذا النحو؟

من الواضح أن استدعاء PrintIt<T> يؤدي إلى إنشاء النوع الصحيح Bar ولكنه لا يستدعي الطريقة الصحيحة أبدًا.

عينة من الرموز:

interface PrintMe
{
    void Print();
}

class Foo : PrintMe
{
    public void Print()
    {
        Console.WriteLine("Foo!");
    }
}

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

class Program
{
    static void Main(string[] args)
    {
        PrintIt<Foo>();
        PrintIt<Bar>();

        var foo = new Foo();
        var bar = new Bar();

        foo.Print();
        bar.Print();

        Console.ReadKey();
    }

    static void PrintIt<T>() where T : PrintMe, new()
    {
        new T().Print();
    }
}

انتاج:

Foo!
Foo!
Foo!
Bar!

الناتج المتوقع:

Foo!
Bar!
Foo!
Bar!
question tracking-external-issue

التعليق الأكثر فائدة

عندما تقوم بـ Print () "جديدًا" ، فإن هذه الطريقة ليست جزءًا من واجهة PrintMe.

ستحصل على نفس النتيجة مع

((PrintMe)new Bar()).Print();

لا الأدوية الجنيسة على الإطلاق.

ال 3 كومينتر

عندما تقوم بـ Print () "جديدًا" ، فإن هذه الطريقة ليست جزءًا من واجهة PrintMe.

ستحصل على نفس النتيجة مع

((PrintMe)new Bar()).Print();

لا الأدوية الجنيسة على الإطلاق.

هذه ليست مسألة ما يفعله CLR ، إنها مسألة ما تفعله اللغة. تقول مواصفات C # :

ترث الفئة جميع تطبيقات الواجهة التي توفرها فئاتها الأساسية.

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

تقدم المواصفات بعد ذلك مثالًا مطابقًا تقريبًا للمثال أعلاه.

هذا يعني أيضًا أنه لجعله يتصرف بالطريقة التي تريدها ، فأنت بحاجة إلى إعادة تنفيذ الواجهة:

c# class Bar : Foo, PrintMe { public new void Print() { Console.WriteLine("Bar!"); } }

svick شكرا على الإجابة

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات