Jesper Sagebrand
Jesper Sagebrand

Reputation: 11

C++ Way of handling multiple inheritance for interfaces

I am looking at refactoring a lot of code and have discussed a bit in relations to the best way of handling inheritance. Given the following three classes

class Listener_Interface {
  public:
    virtual void message(data& data);
}
class Timing_Interface {
  public:
  virtual void timerEvent(data& data);
}
class Action_Interface {
  public:
  virtual void action(data& data);
}

There is a need for a class to implement all these plus provide a some extra specifik methods. Should I inherit like this:

class NewClass_Interface :
 public Listener_Interface,
 public Timing_Interface,
 public Action_Interface {
  public:
    virtual void newMethod();
}
class NewClass : NewClass_Interface {
    ....
}

or

class NewClass_Interface {
  public:
    virtual void newMethod();
}
class NewClass :
 public NewClass_Interface
 public Listener_Interface,
 public Timing_Interface,
 public Action_Interface {
    ....
}

To me the previous seems more correct and easier to test etc. But for some reason all the classes and code looks lite the latter.

Upvotes: 1

Views: 87

Answers (1)

Alexandre Severino
Alexandre Severino

Reputation: 1613

It depends on your logic. Sometimes you might want your NewClass_Interface to not necessarily have a relation with Listener, Timing and Action. But since it doesn't look like the case here, I agree with you. The better you constraint the use of your interfaces, the more reliable your code will be.

So I would go with this:

class Listener_Interface {
  public:
    virtual void message(data& data) = 0;
}
class Timing_Interface {
  public:
  virtual void timerEvent(data& data) = 0;
}
class Action_Interface {
  public:
  virtual void action(data& data) = 0;
}

(Observe how I make your methods pure virtual in order to make your classes real interfaces)

class NewClass_Interface :
 public Listener_Interface,
 public Timing_Interface,
 public Action_Interface
{
  public:
    virtual void newMethod() = 0;
}

class NewClass : NewClass_Interface {
    ....
}

This way you'll have better control on what is going on.

Also, I would advise you of using the most common standard for Interfaces naming: IListener, ITiming, IAction and INewClass.

Upvotes: 2

Related Questions