BlinkingObjects
Applet
In our previous example, letters and digits were implemented as subclasses
of the ScreenCharacter
class.
Screen characters can be drawn on the screen: in our case
this behavior is implemented in the draw
method of the ScreenCharacter
class so that it can be
applied to both letters and digits. Instance variable and other methods
that letters and digits have in common are defined in the superclass as well.
Suppose that you want to implement blinking characters (for highlighting)
in a class BlinkingCharacter
. So you
implement a BlinkingObject
class that contains the methods
startBlinking
, stopBlinking
,
setBlinkingRate
and getBlinkingRate
for drawing a blinking object on the screen.
You want to use these classes to build up the following applet of blinking
letters, digits, ellipses, and rectangles.
It is natural and convenient to make BlinkingCharacter
a subclass of BlinkingObject
. It is also natural and
convenient to make BlinkingCharacter
a subclass of
ScreenCharacter
so that methods are inherited.
So, the class hierarchy that you wish to use is the following:
The designers of Java have made this decision because multiple inheritance
is in practice error-prone: the most common difficulty is name clashing. Suppose
for instance that both superclasses have an instance variable size
.
Which one is the "right" one in the subclass?
The Java developers choose the solution of interfaces to the problem of classifying common behavior.
"Implementing an interface" means promising to include the methods of the interface among the methods that are specific for the class under consideration.
Blinkable
InterfaceBlinkable
could be defined by
By default, the methods in an interface areinterface Blinkable { void startBlinking(); void stopBlinking(); void setBlinkingRate(float r); float getBlinkingRate(); }
abstract
and
public
. The first
keyword indicates that no implementations are given and the second
keyword provides maximal access.
To say that BlinkingCharacter
is a subclass
of ScreenCharacter
and
implements the interface Blinkable
, you write
Here, we only sketch the implementation of the methods that have to do with the blinking rate. The keywordclass BlinkingCharacter extends ScreenCharacter implements Blinkable { public void startBlinking () {...} public void stopBlinking () {...} public void setBlinkingRate (float r) { ... } public float getBlinkingRate () { return blinkingRate } }
public
is obligatory in the above definitions because
otherwise the implementations in the BlinkingCharacter
class
would be less accessible than promised in the Blinkable
interface
(recall that methods declared in an interface are by default public).
If you extend the applet to also draw blinking rectangles and circles
randomly on the screen with help of the above methods, then with
the Blinkable
interface you could in fact call the setBlinkingRate
method without
needing to know what object actually is to be drawn. All you need to know is
that is implements the interface Blinkable
.
Code snippets could be as follows:
A graphical presentation:class Screen { Blinkable b; int rate; ... b.setBlinkingRate(rate); ... }
Blinkable
interface as an extension of, say, the Visible
interface and the Invisible
interface.
We give here an example, the BlinkingObjects, in which you can find the code for the applet, together with the interface. It uses some things that go behind the point we are now, so it is not part of the standard course.