Bob*_*Bob 2 c# generics polymorphism
我正在处理一个错误.在重新创建以下示例的错误时,我能够确定问题发生的原因.但我坚持要求更好的解决方案.所以给出以下程序:
public interface IFoo<T> {
T OutputType(T param);
}
class Foo : IFoo<Foo> {
public virtual Foo OutputType(Foo param) {
Console.WriteLine("foo");
return param;
}
}
class Bar : Foo, IFoo<Bar> {
public virtual Bar OutputType(Bar param) {
Console.WriteLine("bar");
return param;
}
}
class Program {
static void Main(string[] args) {
Bar bar = new Bar();
CallOutputType(bar);
bar.OutputType(bar);
}
static void CallOutputType<T>(T t) where T : Foo {
t.OutputType(t);
}
}
Run Code Online (Sandbox Code Playgroud)
我期待输出为:
bar
bar
Run Code Online (Sandbox Code Playgroud)
但我得到的是:
foo
bar
Run Code Online (Sandbox Code Playgroud)
看到像这样简化的问题很明显Bar.OutputType没有覆盖Foo.OutputType.改善这种设计的最佳选择是什么? Bar.OutputType无法覆盖Foo.OutputType,因为签名不同.更改签名Bar.OutputType匹配Foo.OutputType不会起作用,因为随后酒吧不会implimenting IFoo的.
呃,我对这些东西不太熟悉,但不应该是:
static void CallOutputType<T>(T t) where T : IFoo<T>
{
t.OutputType(t);
}
Run Code Online (Sandbox Code Playgroud)
它在编译时起作用了.