تم اختبار نموذج التعليمات البرمجية على .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!
عندما تقوم بـ Print () "جديدًا" ، فإن هذه الطريقة ليست جزءًا من واجهة PrintMe.
ستحصل على نفس النتيجة مع
((PrintMe)new Bar()).Print();
لا الأدوية الجنيسة على الإطلاق.
هذه ليست مسألة ما يفعله CLR ، إنها مسألة ما تفعله اللغة. تقول مواصفات C # :
ترث الفئة جميع تطبيقات الواجهة التي توفرها فئاتها الأساسية.
بدون إعادة تنفيذ الواجهة بشكل صريح ، لا يمكن للفئة المشتقة بأي شكل من الأشكال تغيير تعيينات الواجهة التي ترثها من فئاتها الأساسية.
تقدم المواصفات بعد ذلك مثالًا مطابقًا تقريبًا للمثال أعلاه.
هذا يعني أيضًا أنه لجعله يتصرف بالطريقة التي تريدها ، فأنت بحاجة إلى إعادة تنفيذ الواجهة:
c#
class Bar : Foo, PrintMe
{
public new void Print()
{
Console.WriteLine("Bar!");
}
}
svick شكرا على الإجابة
التعليق الأكثر فائدة
عندما تقوم بـ Print () "جديدًا" ، فإن هذه الطريقة ليست جزءًا من واجهة PrintMe.
ستحصل على نفس النتيجة مع
لا الأدوية الجنيسة على الإطلاق.