Wednesday, August 4, 2010

How can we take decision about when we have to use Interface and when Abstract Class

How can we take decision about when to use Interface and when Abstract Class.


When we thinking about the entity there are two things one is intention and one is implemntation.


I am trying to make a Content Management System where content is a genralize form of article, reviews, blogs etc.

CONTENT

ARTICLE

BLOGS

REVIEW

So content is our base class now how we make a decision whether content class should be Abstract class, Interface or normal class.


First normal class vs other type (abstract and interface).


If content is not a core entity of my application means as per the business logic if content is nothing in my application only Article, Blogs, Review are the core part of business logic then content class should not be a normal class because I’ll never make instance of that class.


So if you will never make instance of base class then Abstract class and Interface are the more appropriate choice.


Second between Interface and Abstract Class.



CONTENT

Publish ()

ARTICLE

BLOGS

REVIEW

As you can see content having behavior named “Publish”. If according to my business logic Publish having some default behavior which apply to all I’ll prefer content class as an Abstract class.

If there is no default behavior for the “Publish” and every drive class makes their own implementation then there is no need to implement “Publish” behavior in the base case I’ll prefer Interface.


These are the in general idea of taking decision between abstract class, interface and normal class. But there is one catch.

As we all know there is one constant in software that is “CHANGE”.


If I made content class as Interface then it is difficult to make changes in base class because if I add new method or property in content interface then I have to implement new method in every drive class.


These problems will over come if you are using abstract class for content class and new method is not an abstract type.


So we can replace interface with abstract class except multiple inheritance.


CAN-DO and IS-A relationship is also define the deference between Interface and abstract class.


Interface can be use for multiple inheritance


for example we have another interface named “ICopy” which having behavior copy and every drive class have to implements its own implementation of Copy.


If “Article” class drive from abstract class Content as well as ICopy then article “CAN-DO” copy also.

IS-A is for “generalization” and “specialization” means content is a generalize form of Article, Blogs, Review and Article, Blogs, Review are a specialize form of Content.


So, abstract class defines core identity.


If we are thinking in term of speed then


abstract is fast than interface because interface requires extra in-direction.

No comments:

Post a Comment