سؤال

ولدي فئة المسمى "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.}
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top