I'm not sure I'm understanding why they can't do the same things with an interface, if I cass FooBarGetter to IFooReturner, I'd still get a Foo from GetFoo
So something like this works, we can override the return type and it still works because FooBar is a Foo, it still matches the contract of the original class but with more specificity