Saturday, April 22, 2006

Interface and Implementation Inheritance

Inheritance Series Part 1

Recently while working on a problem, I ran into an issue with multiple-inheritance. While the problem itself was due to a compiler bug, it made me think about the virtues and vices of inheritance. Here, I am logging some of my current thoughts.

It seems that in object oriented paradigm, inheritance has realy two broad based uses

  1. Polymorphism
  2. Code Re-use

Polymorphism

Inheritance is at the heart of polymorphism and is one of the stated missions in object orientation. Though this is not the only way of achieving this (as in smalltalk), its use along with late binding provides for a very elegant solution. In this use case there are basically two points to be noted -

  1. Means to specify the contract which the outside world will use - Interface Specification
  2. Means to implement and stagger the implementation - which is obviously supported by inheritance. Single inheritance hierarchy scheme is more than sufficient to stagger the implementation from a generalized version to more specific versions

In other words what we are really doing is that we are inheriting the interface for the purpose of implementation and specialization and this concept is also called Interface Inheritance. Specialization is not implementation inheritance as we are not inheriting the implementation, but overriding it.

Code Re-use

Another use of inheritance and this is my current object of curiosity is Implementation Inheritance. This concept is generally considered a taboo and languages such as Java have banished this all together. C++ on the other hand provides even means to achieve this.

The idea of implementation inheritance is to use mix-in classes to inherit so that the derived classes can inherit the functionality provided by the mixed in class to achive its implementation without trying to expose the interface of the mixed in class. This fact is pretty important.

Lets consider a simple situation where multiple inheritance could be useful. Consider the case code snippet as shown below -


class ListImpl
{
public:
void add(const Element&);
void add(const Element&, int pos)
Element& remove(int pos);
Element& operator[](int pos);
};

class Stack
{
public:
virtual void push(const Element&) = 0;
virtual Element& pop() = 0;
}

class StackImpl :
: public Stack // inherit the interface
: protected ListImpl // part of implementation
{
public:
void push(const Element&);
Element& pop();
}

In the above example, the StackImpl inherits from the Stack ABC to inherit its interface which will be used by its clients. This is typical and what we normally understand. However, the inheritance of ListImpl is part of the stack implementation and is not part its supported and exposed interface and hence is Implementation Inheritance. C++ provides a nice way to hide the implementation inheritance from the users by letting the sub class inherit either privately or protectedly. Had it inherited publically, then the List interface would also have been part of the exposed interface of StackImpl class and this is not what we want.

This is not the only design choice available for Stack implementors. We could have also used Composition relationship between StackImpl and ListImpl class. This would have been a great way and possibly the best way, but if StackImpl needed to access something internal to ListImpl (Probably StackImpl and ListImpl are implemented by the same developer and StackImpl needs to access something internal in ListImpl for the sake of performance), then the only elegant way would have been to inherit it, otherwise, we would have had to expose ListImpl internals.

2 Comments:

Anonymous Anonymous said...

2016-4-21 xiaozhengm
toms shoes outlet online
ray bans
cheap jerseys wholesale
replica watches
fitflops sale clearance
cheap oakley sunglasses
true religion jeans
louis vuitton outlet
ralph lauren
hollister clothing
cartier watches
adidas outlet
tods shoes
designer handbags
coach outlet
ralph lauren outlet
michael kors outlet
cheap oakley sunglasses
cheap jordans
michael kors
louis vuitton outlet
tory burch outlet
jordan 8
jordans
kobe 11
michael kors handbags
michael kors uk
nike air jordan
adidas shoes
gucci outlet
oakley sunglasses
nike air max
louis vuitton outlet online
ray ban outlet
ray ban wayfarer
coach factory outlet
air jordans
nike trainers
caoch outlet
nike roshe runs

12:01 PM  
Blogger oakleyses said...

christian louboutin uk, louis vuitton outlet, christian louboutin shoes, michael kors pas cher, louis vuitton outlet, sac longchamp pas cher, prada handbags, gucci handbags, tiffany and co, polo ralph lauren outlet online, christian louboutin outlet, cheap oakley sunglasses, longchamp outlet, uggs on sale, polo outlet, louis vuitton, nike air max, oakley sunglasses, longchamp outlet, nike free, nike outlet, longchamp outlet, longchamp pas cher, chanel handbags, nike air max, oakley sunglasses, nike free run, tiffany jewelry, oakley sunglasses wholesale, louboutin pas cher, ray ban sunglasses, ugg boots, replica watches, air max, louis vuitton outlet, oakley sunglasses, nike roshe, louis vuitton, tory burch outlet, ray ban sunglasses, jordan shoes, christian louboutin, prada outlet, polo ralph lauren, burberry pas cher, ugg boots, jordan pas cher, kate spade outlet, ray ban sunglasses

8:36 AM  

Post a Comment

<< Home