[英]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.