لماذا مجموعات دروس في C# (مثل ArrayList) ترث من واجهات متعددة إذا كان واحد من هذه الواجهات يرث من المتبقية?

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

سؤال

عندما اضغط على f12 على ArrayList الكلمة للذهاب إلى بيانات التعريف التي تم إنشاؤها من vs2008 ، وجدت أن الفئة التي تم إنشاؤها من الإعلان على النحو التالي

public class ArrayList : IList, ICollection, IEnumerable, ICloneable

وأنا أعلم أن IList بالفعل يرث من ICollection IEnumerable, فلماذا لا ArrayList redundantly ترث من هذه الواجهات?

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

المحلول

وOK، لقد فعلت بعض البحوث. إذا قمت بإنشاء التسلسل التالي:

  public interface One
    {
        void DoIt();
    }

    public interface Two : One
    {
        void DoItMore();
    }

    public class Magic : Two
    { 
        public void DoItMore()
        {
            throw new NotImplementedException();
        }

        public void DoIt()
        {
            throw new NotImplementedException();
        }
    }

وترجمة ذلك، ثم الرجوع إلى DLL في حل مختلف، اكتب السحر واضغط F12، سوف تحصل على ما يلي:

 public class Magic : Two, One
    {
        public Magic();

        public void DoIt();
        public void DoItMore();
    }

وسترى أن التسلسل الهرمي واجهة ودكت، أو المترجم هو إضافة واجهات في؟ إذا كنت تستخدم العاكس تحصل على نفس النتائج أيضا.

تحديث: إذا قمت بفتح DLL في ILDASM، وسترون ذلك قائلا:

والأدوات ... اثنان

والأدوات ... واحد.

نصائح أخرى

وتظهر واجهات إضافية لأنها تنطوي عليها IList. إذا قمت بتطبيق IList، يجب أيضا تنفيذ ICollection وIEnumerable.

وأنا مجرد تخمين، ولكن أعتقد في واقع الأمر يطبق فقط IList في التعليمات البرمجية، ولكن وثائق تظهر بقية الواجهات وكذلك لجعله صريحة للمبرمج باستخدام الفئة.

MSDN ....

<اقتباس فقرة>   

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

     

ويستخدم أيضا تنفيذ صريح   لحل الحالات التي واجهتين   كل إعلان مختلف أعضاء   نفس الاسم مثل خاصية و   الأسلوب:

ولا أقبل هذا الأمر الجواب.

وإنني أكرر ما قاله workmad3 أعلاه.

وخلال تنفيذ ذلك في ArrayList، يصبح من السهل لأحد أن يعرف - التي واجهات ArrayList تنفذ بدلا من أن تصل إلى IList لتجد أنها تنفذ ICollection وIEnumerable

.

وهذا يجنب الحاجة للعودة الى الوراء وإيابا سلسلة الميراث.

وتحرير: وعلى المستوى الأساسي، واجهة تطبيق واجهة أخرى لا يمكن أن يوفر التنفيذ. فئة مشتقة (من IList) تنفذ بالتالي بشكل غير مباشر ICollection وIEnumerable كذلك. لذلك، حتى إذا كنت أكتب الفئة الخاصة بك تنفيذ IList (وليس إضافة ICollection، IEnumerable في الإعلان) - سترى أنه سيكون لديك لتوفير التنفيذ لICollection وIEnumerable

والمنطق workmad3 ذا مغزى.

وتخميني هو أن CLR لا يدعم واجهة يرث من واجهة أخرى.

C# ولكن لا يدعم هذا البرنامج ولكن يجب أن تسطيح الميراث شجرة تكون CLR متوافقة.

[عدل]

بعد أخذ المشورة من الأسفل بسرعة إعداد VB.Net المشروع:

Public Interface IOne
    Sub DoIt()
End Interface

Public Interface ITwo
    Inherits IOne
    Sub DoIt2()
End Interface

Public Class Class1
    Implements ITwo

    Public Sub DoIt() Implements IOne.DoIt
        Throw New NotImplementedException()
    End Sub

    Public Sub DoIt2() Implements ITwo.DoIt2
        Throw New NotImplementedException()
    End Sub
End Class

تجميع النتائج في ما يلي (C#):

public class Class1 : ITwo
{
    public Class1();
    public void DoIt();
    public void DoIt2();
}

هذا البرنامج الذي VB.Net لا لا لشد واجهة الهرمي بدلا من C#.ليس لدي أي فكرة لماذا هذا سيكون.

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