سؤال

أنا جديد على C# لذا قد يكون هذا سؤالًا تفريغًا حقًا: لقد قمت بتطبيق ICOMPARABLE في صفي وأريد اختباره مع NUNIT. ولكن تم تمييز مقارنات المقارنة على أنها خاصة وبالتالي لا يمكن الوصول إليها من الاختبار.
ما سبب هذا وكيف يمكنني إصلاح هذا؟

icomparable:

 
public class PersonHistoryItem : DateEntity,IComparable
    {
     ...
        int IComparable.CompareTo(object obj)
        {
            PersonHistoryItem phi = (PersonHistoryItem)obj;
            return this.StartDate.CompareTo(phi.StartDate);
        }
    }

الاختبار:

 
        [TestMethod]
        public void TestPersonHistoryItem() {
            DateTime startDate = new DateTime(2001, 2, 2);
            DateTime endDate = new DateTime(2010, 2, 2);
            PersonHistoryItem phi1 = new PersonHistoryItem(startDate,endDate);

        PersonHistoryItem phi2 = new PersonHistoryItem(startDate, endDate);

        Assert.IsTrue(phi1.CompareTo(phi2)==0);
    }


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

المحلول

أعتقد أن أسهل طريقة هي استخدام تطبيق الواجهة الضمني:

public class PersonHistoryItem : DateEntity, IComparable
{
    ...
    public int CompareTo(object obj)
    {
        PersonHistoryItem phi = (PersonHistoryItem)obj;
        return this.StartDate.CompareTo(phi.StartDate);
    }
}

نصائح أخرى

إنهم ليسوا خاصين ، فهم فقط نفذت صراحة. إعلان متغيراتك IComparable يجب أن يحل المشكلة:

[TestMethod]
public void TestPersonHistoryItem() {
    DateTime startDate = new DateTime(2001, 2, 2);
    DateTime endDate = new DateTime(2010, 2, 2);
    IComparable phi1 = new PersonHistoryItem(startDate,endDate);

    IComparable phi2 = new PersonHistoryItem(startDate, endDate);

    Assert.IsTrue(phi1.CompareTo(phi2)==0);
}
var p1 = (IComparable)phi1;
var p2 = (IComparable)phi2;

Assert.IsTrue(p1.CompareTo(p2) == 0);

يستخدم نهجك تنفيذ الواجهة الصريحة. هذا يعني أن أساليب الواجهة لن تظهر على صفك ما لم يتم الانتهاء من الممثلين. افعل هذا:((IComparable)phi1).CompareTo(phi2)

المشكلة الرئيسية هنا هي أنك تنفذ بشكل صريح طريقة المقارنة ، والتي تتيح لك استخدامها فقط عند استخدام كائنك ككائن قابل للعلاج.

لتصحيح المشكلة ، حدد الرؤية على أنها عامة وتنفيذ طريقة المقارنة وليس "بشكل صريح":

public class PersonHistoryItem : DateEntity,IComparable
{
    ...

    public int CompareTo(object obj)
    {
        PersonHistoryItem phi = (PersonHistoryItem)obj;
        return this.StartDate.CompareTo(phi.StartDate);
    }
}

في C# ، لا تحدد واجهة الوصول ، حتى تتمكن من عمل CompareTo الطريقة العامة وتغيير تنفيذ الواجهة الصريحة من:

int IComparable.CompareTo(object obj)

إلى:

public int CompareTo(object obj)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top