تحويل نوع فئة قالب؟
-
21-08-2019 - |
سؤال
ولدي فئة المسمى "baseClass". من هذه الفئة I يرث أسماء فئة "inheritedClass" (inheritedClass فئة العمومي: baseClass)
ووbaseClass يحتوي على دالة العامة التي ترجع HashSet<baseClass>
. عندما دعا من inheritedClass، نوع الإرجاع هو واضح لا يزال HashSet<baseClass>
، ولكن أحتاج إلى HashSet<inheritedClass>
.
وA علاء التحويل (HashSet<inheritedClass>
) returnValue، حيث returnValue هي من نوع HashSet<baseClass>
لا تعمل.
هل هناك طريقة لتحويل HashSet نوع من baseClass إلى inheritedClass دون تحويل كل عنصر يدويا؟
وشكرا مقدما، فرانك
المحلول
هل تعني حقا C # في العلامات؟ HashMap
هو نوع جافا. كما أن لديها عادة معلمتين نوع بدلا من واحدة ...
في C #، والطبقات العامة هي دائما ثابتة. بعض م> واجهات <م> سوف م> يكون البديل في C # 4، ولكن عدد قليل جدا (فقط تلك التي إما <م> فقط م> استخدام المعلمة نوع في positiion الإخراج، مثل IEnumerable<T>
، أو <م> فقط م> استخدام المعلمة نوع في وضع الإدخال، على سبيل المثال IComparable<T>
).
إذا كنت يمكن أن توفر معلومات أكثر دقة حول الوضع الخاص بك، سنقوم ربما تكون قادرة على مساعدة التوصل إلى حل بسيط - لا سيما إذا كان يمكنك استخدام LINQ مع طريقة Cast<T>()
لها
وتحرير: حسنا، مع HashSet<T>
:
HashSet<BaseType> baseSet = ...;
var derivedSet = new HashSet<DerivedType>(baseSet.Cast<DerivedType>());
لاحظ أنه حتى مع C # 4 وهذا سيكون ضروريا لأن المترجم لا يعرف أن كل قيمة في baseSet
هي مثيل DerivedType
- لا بد أن يكون الاختيار وقت التنفيذ. العكس (خلق HashSet<BaseType>
من HashSet<DerivedType>
) <م> سوف م> العمل في C # 4.
وتحرير أبعد من ذلك: إذا كنت ترغب فقط في استخدام UnionWith
، وهذا لا يتطلب HashSet<DerivedType>
- أنه يتطلب IEnumerable<DerivedType>
. أقترح عليك القيام به:
HashSet<BaseType> baseSet = ...;
HashSet<DerivedType> derivedSet = ...;
derivedSet.UnionWith(baseSet.Cast<DerivedType>());
نصائح أخرى
إليك الحل
//**Your BaseClass**
public class BaseClass<T> where T : BaseClass<T>
{
public HashSet<T> GetHashSet()
{
HashSet<T> _hSet = new HashSet<T>();
//do some work
//create a HashSet<T> and return;
return _hSet;
}
}
//**Your Inherited/Derived Class**
public class InheritedClass : BaseClass<InheritedClass>
{
//you have the method inherited as you need.}
}