有没有办法在C#中实现以下逻辑? (注意:以下代码无法编译)
abstract class Foo {
void Bar(Object obj);
}
class SubFoo<T> : Foo {
override void Bar(T obj);
}
请注意SubFoo
如何使用更具体的参数类型覆盖Bar(..)
方法。
答案 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需要一个不是整数的字符串。世界爆炸了。