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 需要一个字符串而不是整数。世界爆炸了。
有没有办法在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 需要一个字符串而不是整数。世界爆炸了。