Monday, June 22, 2009

Inheritance vs. composition depending on how much is same and how much differs

I am reading the excellent Django book right now. In the 4th chapter on Django templates, there is an example of includes and inheritance in Django templates.

Without going into details about Django templates, the include is very similar to composition where we can include the text of another template for evaluation. Inheritance in Django templates works in a way similar to object inheritance. Django templates can specify certain blocks which can be redefined in subtemplates. The subtemplates use the rest of the parent template as is.

Now we have all learned that inheritance is used when we have a is-a relationship between classes, and composition is used when we have a contains-a relationship. This is absolutely right, but while reading about Django templates, I just realized another pattern in these relationships. This is really simple and perhaps many of you may have already have had this insight...

We use inheritance when we want to allow reuse of the bulk of one object in other objects such that it can change a few things as per it's requirements. So in a way we have a template which we want to allow reuse of in the greater part and modification of in the smaller part. On the other hand we use composition when we want to reuse another object in this object. So we have a template in which we want to plug some holes in functionality.

Does this make sense?

3 comments:

naysh said...

Nice try
google 'overloading and overriding'

Vasudev Ram said...

Parag,

I didn't quite understand your post, somehow. But anyway, a related point that I came across recently - reading a book by Joshua Bloch:

"Inheritance breaks encapsulation"

I was surprised to read this, but on reading his explanation, it seems to be the case.

The book was, IIRC, Effective Java.

A Google search for:

Joshua Bloch "Inheritance breaks encapsulation"

resulted in some interesting links, not only to pages quoting his book, but to the GoF book, a page on the c2 wiki, and others. Seems the principle or point is older than his book.

- Vasudev

Parag said...

Vasudev,

Effective Java is an excellent book.

I remember reading the part on inheritance breaking encapsulation, and I agree, it does make sense.

I will also do a Google search and check out the other pages you mention.

Thanks