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