user34537
user34537

Reputation:

Abstract class does not implement interface

I have an interface so class writers are forced to implement certain methods. I also want to allow some default implemented methods, so I create a abstract class. The problem is that all classes inherit from the base class so I have some helper functions in there.

I tried to write : IClass in with the abstract base, but I got an error that the base didn't implement the interface. Well of course because I want this abstract and to have the users implement those methods. As a return object if I use base I can't call the interface class methods. If I use the interface I can't access base methods.

How do I make it so I can have these helper classes and force users to implement certain methods?

Upvotes: 11

Views: 7317

Answers (3)

vines
vines

Reputation: 5225

Having faced with the same problem recently, I've came up with a somewhat more elegant (to my mind) solution. It looks like:

public interface IInterface
{
    void CommonMethod();
    void SpecificMethod();
}

public abstract class CommonImpl
{
    public void CommonMethod() // note: it isn't even virtual here!
    {
        Console.WriteLine("CommonImpl.CommonMethod()");
    }
}

public class Concrete : CommonImpl, IInterface
{
    void SpecificMethod()
    {
        Console.WriteLine("Concrete.SpecificMethod()");
    }
}

Now, according to C# spec (13.4.4. Interface mapping), in the process of mapping IInterface on Concrete class, compiler will look up for CommonMethod in CommonImpl too, and it doesn't even have to be virtual in the base class!

The other significant advantage, compared to Mau's solution, is that you don't have to list every interface member in the abstract base class.

Upvotes: 1

Mau
Mau

Reputation: 14468

Make sure methods in the base class have the same name as the interface, and they are public. Also, make them virtual so that subclasses can override them without hiding them.

interface IInterface {
   void Do();
   void Go();
}

abstract class ClassBase : IInterface {

    public virtual void Do() {
         // Default behaviour
    }

    public abstract void Go();  // No default behaviour

}

class ConcreteClass : ClassBase {

    public override void Do() {
         // Specialised behaviour
    }

    public override void Go() {
        // ...
    }

}

Upvotes: 16

Femaref
Femaref

Reputation: 61437

Move the interface methods into the abstract class and declare them abstract as well. By this, deriving classes are forced to implement them. If you want default behaviour, use abstract classes, if you want to only have the signature fixed, use an interface. Both concepts don't mix.

Upvotes: 6

Related Questions