On 18/07/2010 20:56, Mark Morgan Lloyd wrote:
...
Yes, I was thinking that. However if the basic class was say a
round-robin scheduler with phases rrQuiescent and rrInitialised and
the descendant was say an HP comms protocol handler with additional
phases hpReceivingPadding, hpReceivedSync and so on it would seem to
be questionable practice to have to define all possible enumerated
values in the basic class.
...
In this case, enumeration cannot be extended. If you look at it from an
analysis point of view, you're implementing a state machine with an
enumeration. If your state machine is extendable instead of fixed, and
you want to add substates to it, then a possible implementation is to
define a state class:
TSchedulerPhase = Class(TObject);
where the basic phases are defined as variables in the base class, and
initialized in the initialization of the base module:
var
spQuiescent: TSchedulerPhase;
spInitialized: TSchedulerPhase;
Initialization
spQuiescent := TSchedulerPhase.Create;
...
The descendent class can add other states, and compute other transitions.
This is a classic implementation of the state design pattern.
I hope this helps,
Thierry.
_______________________________________________
fpc-pascal maillist - fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal