无法比较数组中的2个对象(与继承和通用进行比较)

时间:2011-01-18 10:27:12

标签: c# inheritance compare

情况是我有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; 
        }

    }

2 个答案:

答案 0 :(得分:0)

通过实施课程Date: Icomparable<Date>

解决

答案 1 :(得分:0)

首先,基类需要实现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)