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