C# IComparable 1 parent 和 2 children

C# IComparable with one parent and 2 children

好吧,我有一个 class 人执行 IComparable<Human>

然后我还有两个 classes 继承自 Human Child:Human 和 Cousin:Human

Parent class 有一个 属性 AGE,在 getter 中有一个抽象函数 getAge() 的调用。

我有一个人类列表,当我在数据网格中显示它们时,每个年龄都会被正确计算。

我想使用年龄作为属性对列表进行排序,所以我制作了 Human 抽象 class 来实现 Icomparable,然后是这样的方法。

public int CompareTo(Human other)
{
     return this.age.CompareTo(other.age);
}

我这样调用ASP中的list.sort()方法

List<Human> hlist = instance.humanlist;
hlist.Sort();
tblHumans.DataSource = hlist;
tblHumans.DataBind();

页面加载了所有数据,但项目未按年龄排序,似乎是按列表中的位置排序。

我的 tblHumans 是

<asp:GridView ID="tblHumans" runat="server">
</asp:GridView>

在Parentclass属性AGE是这样的

public int Age
{
    get
    {
        return getAge();
    }

    set
    {
        age = getAge();
    }
}

getAge() 是我的 child classes 覆盖的抽象方法

计算 returns 值是正确的,当呈现 table 时,每个值都正确。

我做错了什么?

像这样调试你的问题,

List<Human> hlist = instance.humanlist;
hlist.Sort();

// What is the order of the elements here, have they been sorted as you expect?    

tblHumans.DataSource = hlist;
tblHumans.DataBind();

如果列表按照您的预期排序,那么问题出在网格上,如果不是,那么您没有正确实现 IComparableAge 属性。是哪个?

简答

public int CompareTo(Human other)
{
     return this.Age.CompareTo(other.Age);
}

(Age, 不是 age)

更长的答案

您对 Age 属性 的实施已损坏。您有一个 age 字段,但 getter(仅调用 getAge())未使用它的值。而 setter 忽略了隐含的 value 参数,因此它只是将 age 分配给 getAge() 的结果。因此,虽然 setter 尚未被调用,但 age 未初始化且其值为 0。您可能根本不应该有 setter,并且您应该删除age 字段,因为 Age 的值仅由 getAge().

的实现决定

好的,我解决了

感谢大家花时间阅读并回答这个问题。

最后我做了这个:

1) 再次设置年龄 属性 和正常 getter 和 setter 字段 2) 在 child class 中,当我覆盖 getAge 方法时,我也强制设置年龄,因此,当在列表的排序方法中调用 compareTo 时,年龄 属性 被填充所以它显示在 table.

我知道它不是 'the best practic' 但它必须以这种方式制作,因为在这个程序中我不能使用 'complex' 数据模型(甚至不是数据库,但不用担心不是为了生产系统)

再次感谢大家