2

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.

2 Answers 2

5

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>
...
Sign up to request clarification or add additional context in comments.

1 Comment

Nice explanation with Liskov! I did not think seing the problem this way, it definitely makes its resolution clearer! :)
2

Try this trick with 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(...);
    }
}

1 Comment

I had to modify all the consume point of IFooable to convert it to IFooable<T> but it works very smoothely! :D

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.