C#支持返回类型协变,但为什么不支持参数类型逆变。
想象一下这个例子:
abstract class Animal
{
public abstract void PlayWith(Toy toy);
}
class PlayfulMonkey : Animal
{
public override void PlayWith(Object toy) // PlayfulMonkey can play with anything
{
// Monkey playing with its object...
}
}
C# 编译器在尝试此操作时会向您抛出错误。但我觉得允许这样做是很有意义的。
您无法更改
override
中的方法签名,但您可以 重载 该方法:
class PlayfulMonkey : Animal
{
public override void PlayWith(Toy toy)
{
// Monkey playing with its toy...
}
public void PlayWith(Object obj) // PlayfulMonkey can play with anything
{
// Monkey playing with its object...
}
}
请注意,重载是一个完全不同的方法,仅适用于
PlayfulMonkey
,并且您可以根据需要决定如何连接这两个方法(例如,如果对象是Toy
,则重新路由到Toy
版本) ,或将 toy
实例从 Toy
方法传递到 Object
方法)。