Re: Using "abstract" on a class with no abstract method
"Mike Schilling" <mscottschilling@hotmail.com> writes:
Is there a master list of commands, or are they added by optional
components as well?
There is no master list.
In the simple case, the commands are part of the component,
as I have written before:
/*** The clock component ***/
abstract class ClockCommand extends Command {}
class QuitClockCommand extends ClockCommand {}
class AdjustClockCommand extends ClockCommand {}
class Clock implements Processor
{ public Processor other;
...
Here, the command hierarchy is part of the clock component.
This is important so that to add a new component, one
needs to add or change in /one/ place - not in two places
(1st the component, and 2nd the master list).
This means, that there still is some compile-time dependency,
because the component must be available, when a call like
container.process( new AdjustClockCommand() );
is being compiled.
But this will work at run-time, when there is no instance
of the clock component at run-time, or when there is one,
or when there are multiple instances of it.
If ever needed, even this dependency can be removed by
splitting the above code into a ?standard clock message
interface? and a ?A concrete clock component?.
/*** The standard clock message interface ***/
abstract class ClockCommand extends Command {}
class QuitClockCommand extends ClockCommand {}
class AdjustClockCommand extends ClockCommand {}
/*** A concrete clock component ***/
class Clock implements Processor { ... }
/*** Another concrete clock component ***/
class Clock1 implements Processor { ... }
Now, the compiler only needs to know the standard clock
message interface to compile
container.process( new AdjustClockCommand() );
It does not need to know the clock component at all.
If the former, you could assign each command a numeric value, and
eliminate instanceof by changing command processing to a switch
statement. Even if the latter, you could assign each compnent a
unique namespace and assign numbers within the component. Command
processing becomes
if (cmd.getNamespace.eq("http:://clock.org")
{
switch(cmd.getCommandNumber())
{
case CLOCK_SET:
...
}
}
Yes, but what I like about using the Java class hierarchy
for this is that I get a tree hierachy for free. That is,
my code can use the fact that
QuitClockCommand is a ClockCommand, which is a Comand, and that
AdjustClockCommand is a ClockCommand, which is a Comand,
for example, when nesting tests as in
if( command instanceof CounterCommand )
{ if( command instanceof QuitCounterCommand )...
if( command instanceof IncrementCounterCommand )... }
.