簡體   English   中英

無法比較數組中的2個對象(與繼承和通用進行比較)

[英]Failed to compare 2 objects in the array (compare with inheritance and generic)

情況是我有2個類(一個基類和一個繼承自基類的派生類)。 這兩個類都實現了CompareTo方法,因此我可以對列表進行基本排序。

基類包含以下值:

day, month  and year

派生類繼承了這3個並增加了2個:

hours and minutes

問題是當我在列表中添加Date和DateTime對象時,它只在日月和年份正​​確排序。

保存的DateTime對象(日,月,年,小時和分鍾)僅對基本屬性進行正確排序,其中小時和分鍾根本不進行排序。

但是,當我評論所有日期對象並且只添加DateTime對象時,整個排序正確完成...

當我在基本方法中使用Virtual並在派生的calss中override時(在CompareTo方法上),我收到錯誤“無法比較數組中的2個對象”

編碼:

Program.cs中:

    List<Date> slDate = new List<Date>();

    slDate.Add(new Date(1, 2, 2011));
    slDate.Add(new Date(06, 01, 2000));

    slDate.Add(new DateTijd(10, 11, 2011, 5, 20));              
    slDate.Add(new DateTijd(8, 11, 2011, 20, 01));
    slDate.Add(new DateTijd(8, 11, 2011, 20, 30));


    slDate.Sort();

    for (int i = 0; i < slDate.Count; i++)
    {
        Console.WriteLine("{0}", slDate[i].ToString());
    }

Date.cs(基類):

    //Constructor
    public Date(int d, int m, int j)
    {
      // .....
    }


    public virtual int CompareTo(Date d)
    {
        int res;

        res = this.Year.CompareTo(d.Year); //Year is a property
        if (res != 0) return res;

        res = this.Month.CompareTo(d.Month);
        if (res != 0) return res;

        res = this.Day.CompareTo(d.Day);
        if (res != 0) return res;

        return 0;
    }

}/*Date*/

DateTime.cs(派生類):

    //Constructor
    public DateTime(int d, int m, int j, int h, int min): base(d, m, j)
    {
        //....
    }

    class DateTime: Date //derived class
    {
        //code ....

        public override int CompareTo(Date d) 
        {
            DateTime dt = (DateTime)d;
            int res;

            res = this.Hours.CompareTo(dt.Hours);
            if (res != 0) return res;

            res = this.Minutes.CompareTo(dt.Minutes);
            if (res != 0) return res;

            return 0; 
        }

    }

通過實現類Date: Icomparable<Date>解決Date: Icomparable<Date>

首先,基類需要實現IComparable。
其次,您的子類正在嘗試將Date轉換為DateTime(並非總是如此)。

public override int CompareTo(object obj) 
{
   var comparison = base.CompareTo(obj);
   if(comparison == 0 && obj is DateTime)
   {
      DateTime dt = (DateTime)obj;
      int res;

      res = this.Hours.CompareTo(dt.Hours);
      if (res != 0) return res;

      res = this.Minutes.CompareTo(dt.Minutes);
      if (res != 0) return res;

      return 0; 
    }
    return comparison;
}

所以,我們執行基類的比較。 如果它確定它們是平等的,並且我們正在處理日期時間,那么我們需要進一步比較。 否則,只返回基值

注釋的多態性示例:

 public int DoCompare(Date firstDate, Date secondDate)
 {
    int res;

    res = firstDate.Year.CompareTo(secondDate.Year); //Year is a property
    if (res != 0) return res;

    res = firstDate.Month.CompareTo(secondDate.Month);
    if (res != 0) return res;

    res = firstDate.Day.CompareTo(secondDate.Day);
    if (res != 0) return res;

    return 0;
 }

我們可以像這樣使用這個函數:

var test = DoCompare(new DateTime(8,11,2011,20,30), new Date(1, 2, 2011));

注意我們剛剛傳入一個DateTime,函數占用了Date。 我們可以這樣做,因為我們保證DateTime將具有Date具有的所有功能和屬性(以及更多......但是現在我們不關心其他功能)。

現在看看這個功能:

public int DoCompareDateTimes(DateTime firstDate, DateTime secondDate)
{
 int res;

 res = firstDate.Year.CompareTo(secondDate.Year); //Year is a property
 if (res != 0) return res;

 res = firstDate.Month.CompareTo(secondDate.Month);
 if (res != 0) return res;

 res = firstDate.Day.CompareTo(secondDate.Day);
 if (res != 0) return res;

 res = this.Hours.CompareTo(dt.Hours);
 if (res != 0) return res;

 res = this.Minutes.CompareTo(dt.Minutes);
 if (res != 0) return res;

 return 0;
}

var test = DoCompareDateTimes(new DateTime(8,11,2011,20,30), new Date(1, 2, 2011));

我們不能這樣做。 該函數期望DateTime的對象,但我們傳入了一個Date(由於DateTime具有Date沒有的功能,因此無法轉換為DateTime)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM