[comp.lang.eiffel] Repeated Inheritance Problem

s872625@minyos.xx.rmit.oz (Chris Cogdon [Brataccas]) (04/10/90)

I have found a possible bug/design fault/undocumented feature with the
Eiffel design/implementation and was wondering if someone could enlighten
me to its purpose. Apols. if this item has already been discussed.

The problem lies with repeated inheritance. An example:

class A
export i
feature i : INTEGER
end -- class A

class B
inherit A rename i as i1;
	A rename i as i2;
end -- class B

Assume proper Create clauses and something to set the values of the
attributes. Pardon the indenting too.

In some routine:

local obj_a : A;
      obj_b : B
do
    b.Create;
    -- set values of b.i1 and b.i2 as, for example, 13 and 27 respectively.
    a := b;
    io.output.putint(a.i);
    -- etc


In the implementation of Eiffel we have here, a.i will return 13 (the first
of the two). But the real value of a.i is debatable.

B conforms to A, certainly. But, in effect, there are two A's in B!! There
is no problem if repeated inheritance results in the one feature, but there
is a problem if it is duplicated when referenced from the original class
(as above).

I can see 3 solutions:

1.  Make repeated inheritance of an exported (at or above the point
    of duplication, class A above) feature that would result in
    duplication an error (or at least a warning).

2.  Formally define the above effect. ie. Referencing a feature which
    is really, at run-time, a duplicated feature will access the first
    listed in the inheritance clause. I'll call this the dominant feature.
    This creates a problem if you want, for example, feature 'i' from the
    first of a pair of inherited class 'A's, and 'j' from the second.

3.  To solve the problem in 2. add a language construct to specifiy which
    features in duplicated inheritance are 'dominant'.

This would not be a rarely occurring problem. Consider the US/French
Driver example from 'OO Software construction'. Create an instance of
US_FRENCH_DRIVER and assign to a DRIVER entity. If the classes have an
age(not duplicated) and licence number(duplicated). What would be
the result of driver_instance.licence_number??

Could someone elaborate what philosophy has been taken on this, and whether
or not it already is in the manuals, and I've overlooked it!!


-------------------------------------------------------------------------------
Chris Cogdon [Brataccas]                 s872625@minyos.xx.rmit.oz
All spelling and gramatical errors are the fault of a malicious filter.
Semantic errors are the fault of a warped mind.