Я работаю через ошибку. При воссоздании ошибки для следующего примера я смог определить причину возникновения проблемы. Но я застрял для лучшего решения. Итак, с учетом следующей программы:
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 не будет работать, потому что тогда Bar не будет влиять IFoo .