我正在通过一个错误工作。在重新创建以下示例的错误时,我能够确定问题发生的原因。但我坚持要有更好的解决方案。因此,考虑下面的程序:如何在实现接口时从泛型方法中正确地返回T?
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);
}
}
我期待的输出为:
bar
bar
但是我得到的是:
foo
bar
见此简化这个样子是问题明显的是Bar.OutputType不是覆盖Foo.OutputType。什么是改进这种设计的最佳选择? Bar.OutputType无法覆盖Foo.OutputType因为签名是不同的。更改Bar.OutputType的签名匹配Foo.OutputType将无法正常工作,因为那时酒吧不会implimenting IFoo的。
嗯,我想现在来测试这个,有什么我想我可能最终做的是在CallOutputType - ((IFoo)t).OutputType(t);由于其他原因,我无法更改方法常数。 –
Bob
2009-06-25 20:42:47