سؤال

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

هنا هو فكرة :لدي عدة قائمة فئة مشتقة ، أود أن أدعو المهام العامة على تلك القوائم (accesing وتعديل أعضاء الفئة الأساسية).وأنا أشعر أن هناك علاقة الميراث لكن لا يتمكن من جعله يعمل كما أريد الآن .

هنا هو مثال بسيط جدا من ما أنا تنوي القيام به :

class Baseclass
{
    public int ID;
    public string Name;
}
class DerivedClass1 : Baseclass
{
}

private void FuncOnBase(List<Baseclass> _collection)
{
    // ...

    foreach (Baseclass obj in _collection)
    {
        ++obj.ID;
    }

    // ...
}
private void FuncTest()
{
    List<DerivedClass1> collection1 = new List<DerivedClass1>();
    collection1.Add(new DerivedClass1() { ID = 1 });
    collection1.Add(new DerivedClass1() { ID = 2 });
    collection1.Add(new DerivedClass1() { ID = 3 });

    FuncOnBase(collection1);   //  ==> forbidden, cannot convert the derived class list to the base class list
}
هل كانت مفيدة؟

المحلول

يجب أن نحب الفرق.A List<DerivedClass1> هو لا a List<Baseclass> - خلاف ذلك ، FuncOnBase يمكن أن تحاول إضافة Baseclass إلى قائمة المترجم لن بقعة.

خدعة واحدة هو استخدام طريقة عامة:

private void FuncOnBase<T>(List<T> _collection) where T : Baseclass
{
    // ...

    foreach (T obj in _collection)
    {
        obj.ID++;
    }

    // ...
}

حيث على سبيل المثال أنا عرضت أعلاه - ملاحظة أننا قادرون على إضافة T إلى القائمة ؛ مفيدة على وجه الخصوص إذا أضفنا T : new() القيد أو تمر (على سبيل المثال) ، params T[].

نلاحظ أيضا أن IEnumerable<T> يصبح التغاير في C# 4.0 / .NET 4.0 حتى إذا مرت في مجرد IEnumerable<Baseclass> (بدلا من قائمة) سيكون العمل "كما هي":

private void FuncOnBase(IEnumerable<Baseclass> _collection)
{
   ///...
}

نصائح أخرى

إذا كنت تفعل سوى foreach، أن يعلن FuncOnBase(IEnumerable<Baseclass> collection)، والتي يمكنك الاتصال من FuncTest مثل هذا:

FuncOnBase(collection1.Cast<Baseclass>());

وعندما تقوم بتعريف الأسلوب مع المعلمة List<T> ولكن فقط استخدام ميزات IEnumerable<T> لها، كنت تقوم بإضافة القيود API التي لا تعني شيئا في التعليمات البرمجية.

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