Ant*_*ton 1 c# overloading derived
考虑以下基本类布局:
public class Base : IComparable<Base>
{
public int CompareTo(Base other)
{
//Do comparison
}
}
public class Derived : Base, IComparable<Derived>
{
public int CompareTo(Derived other)
{
//Do comparison
}
}
public class BaseComparer : IComparer<Base>
{
public int Compare(Base x, Base y)
{
return x.CompareTo(y);
}
}
Run Code Online (Sandbox Code Playgroud)
然后使用如下:
List<Base> thingies = new List<Base>
{
new Base(),
new Derived(),
new Derived()
};
thingies.Sort(new BaseComparer());
Run Code Online (Sandbox Code Playgroud)
我期待Comparer在其x和y参数都是Derived实例的情况下调用Derived.CompareTo方法.
但是,事实并非如此,而是调用了Base.CompareTo,我一直在想为什么.我似乎无法通过对C#语言规范中描述的重载决策规则的基本理解来推断这种行为.
有人可以为我阐明这一点吗?
Base什么都不知道它的派生类 - 所以在Base那里只有一个 CompareTo方法,并且无条件地调用.
重点是在编译时发生重载解析,其中没有关于Base可用的实际引用类型的信息.您需要覆盖该方法Derived,而不是重载它:
public class Derived : Base
{
public override int CompareTo(Base other)
{
//Do comparison
}
}
Run Code Online (Sandbox Code Playgroud)
另外标记Base.CompareTo方法virtual.
请注意,这不再实现IComparable<Derived>.您也可以这样做,但出于与您无关的目的.