[comp.lang.eiffel] inheritance and generic parameters

jos@cs.vu.nl (01/09/89)

> Too bad you didn't have access to the actual system; then you could
> have seen that solution 1.2b is indeed used in the graphical library
> (class GEN_WINDOW). The class actually inherits from
> 
>	TREE [like Current]

The class variant should include something like w.child = w.child_value.
(GEN_WINDOW is a hierarchical window class.)

This seems like a waste of memory. The value is always kept twice.
Also, it is a kind of redundancy that should be avoided if possible.
In this case you need a class TREE without generic parameter.

This is a general problem, which can occur for each class with generic
parameters.  You need the same class with and without generic parameter.
You can make a non-generic class from a generic one, using class invariants
like the one above, but you can make a generic class from a non-generic one
in a conceptually cleaner way.  In eiffel the solution could be as follows:

    Define a class ITREE without generic parameters.  This class should look
    exactly like the existing TREE class.  Also define a class GEN_VALUE:

    class GEN_VALUE[T] export
	value, change_value
    feature
	value : T;

	change_value(new : T) is
	do
	    value := new;
	end;
    end;

    Now the generic class TREE can be defined as something like:

    class TREE[T] export ... -- same as ITREE and node_value, change_node_value.

    inherit ITREE,
	    GEN_VALUE[T] rename value        as node_value,
				change_value as change_node_value;
    end;

The class GEN_VALUE should be defined only once and can be inherited by
each class that needs a generic version.
In this way it is easy to support the same class with and without generic
parameters. And the redundancy expressed by class variants like 
w.child = w.child_value is not needed anymore.

                                 Jos Warmer
				 jos@cs.vu.nl
				 ...uunet!mcvax!cs.vu.nl!jos