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

时间:2018-01-19 17:45:53

标签: c# methods types override abstract

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

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

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

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

2 个答案:

答案 0 :(得分:4)

否则覆盖必须与原始签名具有相同的签名。有几种选择:

使基类通用

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);
}

使用界面而不是抽象类来隐藏不太具体的重载

interface Foo
{
    void Bar(object obj);
}

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

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

答案 1 :(得分:1)

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

Foo myFoo = new SubFoo<string>();

myFoo是一个Foo,它接受​​一个对象,但它实际上是一个带字符串的SubFoo实现。那么当你打电话

时,你会发生什么?
myFoo.Bar(1);

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