سؤال

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

وكتبت كتبت وظيفة على هذا النحو:

public static bool BetterCompare(IComparable lhs, IComparable rhs, out retCode)
{
    ...
    retCode = lhs.CompareTo(rhs);
    ...
}

ولكن المشكلة هو أنه إذا كان لدي class AwesomeClass : IComparable<AwesomeClass>. في الحقيقة لدي عدة عن بعض الطبقات IComparable القديمة وقد ذهب IComparable<T>. ومع ذلك، فإن المترجم يغضب لأنه لا يمكن تحويل هذه الكائنات الجديدة إلى IComparable. أنا لا أعرف إذا كان هذا يجعل الأمر سوءا، ولكن البعض منهم abstract (على الرغم من فئة مجردة لا يقدم التنفيذ).

وكيف يمكنني نقل "أريد اثنين من الكائنات التي يمكن أن أدعو CompareTo على" وليس لديها المترجم تعطيني أي الشفة. ويفضل أن وظيفة جديدة لا تبدو BetterCompare<AwesomeClass>(this, that, out retCode);، ولكن فقط "فعل الشيء الصحيح". أو هل هناك طريقة أفضل للقيام بذلك دون لمس كل فئة مما يجعلها <م> على حد سواء IComparable وIComparable<T>؟

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

المحلول

ويمكنك جعل إما AwesomeClass تنفيذ واجهة IComparable nongeneric وكذلك IComparable<T>، أو يمكنك الكتابة أسلوب BetterCompare عام:

public static bool BetterCompare<T>(T lhs, T rhs, out retCode)
    where T : IComparable<T>
{
    ...
    retCode = lhs.CompareTo(rhs);
    ...
}

و(لاحظ أن هذا يمكن أن يعيش جنبا إلى جنب مع طريقة الموجودة لديك).

نصائح أخرى

ويمكنك دائما أن تغيير المتغيرات لنوع كائن ومن ثم استخدام انعكاس لمعرفة ما اذا كان تنفيذ واحدة من واجهات ثم يلقي بها إلى الواجهة الصحيحة.

ملحوظة: التأمل هو مجنون بطيئة، لذلك استخدامها بحذر

.

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

الوثائق يقول:

والكائن إرجاعها بواسطة الخاصية افتراضي يستخدم واجهة عامة System.Collections.Generic.IComparable<T> للمقارنة بين الكائنات. إذا لا نوع T تنفيذ اجهة عامة IComparable<T>، الخاصية افتراضي بإرجاع Comparer<T> يستخدم واجهة System.Collections.IComparable.

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