I am having trouble implementing an interface with C#:
public interface IFooable
{
public (IFooable left, IFooable right) FooWith(IFooable other);
}
And then in my concrete class, I have
class Concrete
{
public (Concrete left, Concrete right) FooWith(Concrete other)
{
return GoFooSomewhereElse(...);
}
}
But in my tests, the compiler tells me that Concrete
does not implement the FooWith function.
I don't really understand what is going on, since I am so new at C# and easily confused by the language!
I found similar questions (eg Why can't I override my interface methods?) but they did not solve my problem.
According to Liskov Substitution Principle, a superclass object should be replaceable with a subclass object without breaking the functionality of the software.
Your Concrete
class apparently doesn't implement the interface, because if I try to pass the argument of some AnotherFooable
class to FooWith()
method it will not work.
Instead you could make it generic:
public interface IFooable<T>
{
public (T left, T right) FooWith(T other);
}
class Concrete : IFooable<Concrete>
{
public (Concrete left, Concrete right) FooWith(Concrete other)
{
return GoFooSomewhereElse(...);
}
}
Also you can put the restriction to the generic type argument, if you want FooWith()
method to accept only arguments of the same class (as in your example, where you have Concrete.FooWith(Concrete, Concrete)
):
public interface IFooable<T> where T : IFooable<T>
...