arapis@cui.unige.ch (Constantin Arapis) (02/07/91)
QUESTION CONCERNING THE TYPE SYSTEM OF EIFFEL --------------------------------------------- I don't know whether the following issue on the type system of Eiffel has ever been discussed in this group. It is obvious that the type system of Eiffel is essentially the type system published in [Cardelli84]. However, between the two type systems there is a difference concerning the redefinition of operations. In [Cardelli84] the type of the argument of the redefined routine must be a supertype of the original type. In Eiffel the oppposite is required, that is the type of the argument of the redefined routine must be a subtype of the original type. The program below ilustrates this situation in Eiffel: the routine op of class C1 has been redefined in class C2. The type of the argument is T1 in class C1 while in C2 the type of the argument is T2 (a subtype of T1). The rule adopted by Eiffel may lead to correct typed programs (no compile errors) which whenever executed produce run-time errors (version 2.1 of Eiffel). Such errors could be avoided if Eiffel had adopted exactly the rules of the type system described in [Cardelli84]. My question is why Eiffel has adopted this rule? Was it an error design? If it is not a design error which considerations led to that choice? --------------------------------------------------------------- class T1 export print1 feature io: STD_FILES; Create is do io.Create; end; print1 is do io.output.putstring("object T1\n"); end; end; class T2 export print1, print2 inherit T1 feature Create is do io.Create; end; print2 is do io.output.putstring("object T2\n"); end; end; class C1 export op feature op(arg: T1) is do arg.print1; end; end; class C2 export op inherit C1 redefine op feature op(arg: T2) is do arg.print1; arg.print2; end; end; class MAIN feature objC1: C1; objC2: C2; objT1: T1; Create is do objC2.Create; objC1 := objC2; objT1.Create; objC1.op(objT1); -- !!! RUN-TIME ERROR end; end; ------------------------------------------------------------- [Cardelli84] Cardelli 1984 A Semantics of Multiple Inheritance. In Semantics of Data Types. Lecture Notes of Computer Science, Vol. 173, edited by G.Kahn, D. MacQueen, and G. Plotkin Springer-Verlag. Constantin Arapis Centre Universitaire Informatique University of Geneva e-mail: arapis@cuisun.unige.ch