然后把 Comparer<学生> 这个 抽象基类 删除,让 学生比较器 仅仅 实现 IComparer<学生>接口 。。你会发现,这时候,代码不能通过编译。。原因其实很好玩,那就是 override 这个关键字。。很明显,如果一个类只是实现了 接口,是不可能使用这个关键字的,必须删除该关键字。那么,如果,你实现了 接口 的这个公共方法,并且想让子类有机会重写的话,那个关键字应该是啥?
- class 学生比较器 : IComparer<学生>
- {
- public int Compare(学生 x, 学生 y)
- {
- return x.CompareTo(y);
- }
- }
复制代码不用多考虑了,肯定应该是 virtual(中间垫一个 抽象基类 的话,抽象基类用 abstract,如果是非抽象的父类,正是该用 virtual)。。CLR对于 virtual 是很敏感的,对于 CLR 而言,virtual不virtual,那是两种不同的方法调用。