[comp.lang.eiffel] Repeated Inheritance and Dynamic Binding

florman@randvax.UUCP (Bruce Florman) (04/05/89)

    The other day I got to wondering how Eiffel would resolve a reference 
to a feature for which, through repeated inheritance and redefinition, the 
object's dynamic type had more than one definition.  OOSC didn't seem to 
say how it would be done (of course I may have overlooked something), so I 
wrote the following small program as a test.


CLASS A EXPORT do_it
INHERIT STD_FILES
FEATURE
    do_it IS DO output.putstring_nl("Doing it from A") END
END -- CLASS A


CLASS B
INHERIT A REDEFINE do_it
FEATURE
    do_it IS DO output.putstring_nl("Doing it from B") END
END -- CLASS B


CLASS C
INHERIT A REDEFINE do_it
FEATURE
    do_it IS DO output.putstring_nl("Doing it from C") END
END -- CLASS C


CLASS D
INHERIT B RENAME do_it AS do_it_from_b;
	C
END -- CLASS D


CLASS E
INHERIT C;
	B RENAME do_it AS do_it_from_b
END -- CLASS E


CLASS F
FEATURE
    Create IS
	LOCAL an_a: A; a_d: D; an_e: E
	DO
	    a_d.Create;
	    an_a := a_d;
	    an_a.do_it;
	    an_e.Create;
	    an_a := an_e;
	    an_a.do_it
	END
END -- CLASS F


Executing the resulting binary produces the following result.

%f
Doing it from C
Doing it from B
%


Obviously the order in which a class inherits its ancestors has an effect 
on the semantics of such a reference.  I wonder, however, if the result we 
see here (ie. last inheritance takes precedence) can be relied upon, or if 
the result should be considered implementation dependent.  Any comments?

-BRUCE Florman (florman@rand.org)
-The RAND Corporation

		Since RAND has decided that its name is spelled 
		with all caps, I've decided that mine is too.