c# 使用更具体的类型声明覆盖方法

c# override method with more specific type declaration

有没有办法在C#中实现以下逻辑? (注:以下代码编译不通过)

abstract class Foo {
    void Bar(Object obj);
}

class SubFoo<T> : Foo {
    override void Bar(T obj);
}

注意 SubFoo 如何使用更具体的参数类型覆盖 Bar(..) 方法。

不可以,覆盖必须具有与原始签名相同的签名。有几种选择:

使基础 class 通用

abstract class Foo<TArg>
{
    public abstract void Bar(TArg obj);
}

class SubFoo<T> : Foo<T>
{
    public override void Bar(T obj) { }
}

保留原来的功能并添加重载

abstract class Foo
{
    public abstract void Bar(object obj);
}

class SubFoo<T> : Foo
{
    public void Bar(T obj) { }
    public override void Bar(object obj) => this.Bar((T)obj);
}

使用接口而不是抽象 class 来隐藏不太具体的重载

interface Foo
{
    void Bar(object obj);
}

class SubFoo<T> : Foo
{
    public void Bar(T obj) { }

    void Foo.Bar(object obj) => this.Bar((T)obj);
} 

不,你不能那样做。想象一下这段代码:

Foo myFoo = new SubFoo<string>();

myFoo 是一个接受对象的 Foo,但它实际上是接受字符串的 SubFoo 的实现。那么当您调用

时您希望发生什么
myFoo.Bar(1);

Foo.Bar 需要一个对象,所以你可以传入一个整数,但 SubFoo 需要一个字符串而不是整数。世界爆炸了。