When to use interface and abstract class is one of the most popular object oriented design questions and almost always asked in Java, C#, and C++ interviews. In this article, we will mostly talk in the context of Java programming language, but it equally applies to other languages as well.
The question
usually starts with a difference between abstract class and interface in Java,
which is rather easy to answer, especially if you are familiar with the syntax of
Java interface
and abstract class. Things start getting difficult when
interviewer ask about when to use abstract class and interface in Java, which
is mostly based upon a solid understanding of popular OOPS concepts like
Polymorphism, Encapsulation, Abstraction, Inheritance, and
Composition. Many programmers fumbles here, which is natural because most
of them haven't gone through real system design process and haven’t seen the
impact of choosing one over other.
The repercussion of design decisions are best known during the maintenance phase, a good design allows seamless evolution while maintaining a fragile design is a nightmare.
While deciding when to use interface and abstract class, it’s important to know difference between abstract class and interface in Java. In my opinion, following two differences between them drives decision about when to use abstract class or interface in Java.
The repercussion of design decisions are best known during the maintenance phase, a good design allows seamless evolution while maintaining a fragile design is a nightmare.
While deciding when to use interface and abstract class, it’s important to know difference between abstract class and interface in Java. In my opinion, following two differences between them drives decision about when to use abstract class or interface in Java.
1)
Interface in Java can only contains declaration. You can not declare any concrete
methods inside interface. On the other hand abstract class may contain both
abstract and concrete methods, which makes abstract class an ideal place to
provide common or default functionality. I suggest reading my post 10 things to
know about interface in Java to know more about interfaces, particularly in
Java programming language.
2) Java interface can extend
multiple interface also Java class can implement multiple interfaces, Which
means interface can provide more Polymorphism support than abstract class . By
extending abstract class, a class can only participate in one Type hierarchy
but by using interface it can be part of multiple type hierarchies. E.g. a
class can be Runnable and Displayable at same time. One example I can remember
of this is writing GUI application in J2ME, where class extends Canvas and implements CommandListener
to provide both graphic and event-handling functionality..
3) In
order to implement interface in Java, until your class is abstract, you need to
provide implementation of all methods, which is very painful. On the other hand
abstract class may help you in this case by providing default implementation.
Because of this reason, I prefer to have minimum methods in interface, starting
from just one, I don't like idea of marker interface, once annotation is
introduced in Java 5. If you look JDK or any framework like Spring, which I
does to understand OOPS and design patter better, you will find that most of
interface contains only one or two methods e.g. Runnable, Callable, ActionListener
etc.
When to use interface and abstract class in Java
As I
said earlier, it's easy to answer questions like difference between abstract
class and interface in Java, but difficult to answer follow-ups. Though most
of Java Interview starts with former
one, later it goes to see if you have really used abstract class and interface
or not. In order to answer this question, you need to have good understanding
of OOPS concepts like Polymorphism, Encapsulation,
Abstraction and Inheritance. Also familiarity with coupling and cohesion is
important. You at least should know that effort of designing should lead to
reduce coupling and increased cohesion, ease of maintenance etc. In this part,
we will see some scenarios, guidelines, rules which can help you to decide when to use abstract class and interface in
Java.
1) In Java particularly, decision
between choosing Abstract class and interface may influence by the fact that
multiple inheritance is not supported in Java. One class can only extend
another class in Java. If you choose abstract class over interface than you
lost your chance to extend another class, while at the same time you can
implement multiple interfaces to show that you have multiple capability. One of
the common example, in favor of interface over abstract class is Thread vs
Runnable case. If you want to execute a task and need run() method it's better
to implement Runnable interface than extending Thread class.
2) Let's see another case where
an abstract class suits better than interface. Since abstract class can include
concrete methods, it’s great for maintenance point of view, particularly when
your base class is evolving and keep changing. If you need a functionality
across all your implementation e.g. a common method, than, you need to change
every single implementation to include that change if you have chosen interface to describe your
base class. Abstract class comes handy in this case because you can just define
new functionality in abstract super class and every sub class will automatically
gets it. In short, abstract class are great in terms of evolving functionality.
If you are using interface, you need to exercise extra care while defining
contracts because its not easy to change them once published.
3) Interface in Java is great for
defining Types. Programming for interfaces than implementation is also one of
the useful Object oriented design principle which suggests benefit of using
interface as argument to function, return type etc.
No comments:
Post a Comment