jellinghaus-robert@CS.Yale.EDU (Rob Jellinghaus) (05/19/89)
The expanded type facility (defined in a previous posting) seems like
a tremndously useful and powerful extension to the language. But I
have a question:
In the document as posted, it says that a feature invocation of the form
"a.Copy(b)" will copy the fields of b onto those of a, if both a and b
are of expanded type. But consider the following:
expanded class X export
i, set_i
feature
i: INTEGER;
set_i(a: like i) is
do
i := a
end
end -- class X
expanded class Y export
i, set_i, j, set_j
inherit
X
feature
j: INTEGER;
set_j(a: like j) is
do
j := a
end
end -- class Y
Now if we assume a is of type X and b of type Y, and we perform a.Copy(b),
what happens to b's j attribute? I assume it is not copied? (The call is
allowed, as b's type is a descendant of a's.)
Now what if Y is redefined as
expanded class Y export
i, set_i
inherit
X
redefine i
feature
i: REAL
end -- class Y
Now the problem with a.Copy(b) is obvious. How can one copy a real onto
an integer field? The call is still valid, but it is not clear to me
what Eiffel will do in this situation.
I eagerly await clarification (and version 2.2 documentation).
On another note: will it be possible, in version 2.2, to create an object
of some type which is only known at runtime? For example, if I determine
(using the hazardous class INTERNAL) that some object a has type denoted
by "class_name(a)", how can I define some object b with that same type,
and then (for example) do "b.Copy(a)"? (This could be useful if one is
attempting to implement a STORABLE class with extensions, or if one simply
wants to be able to duplicate generic objects at runtime.)
Thanks for your assistance.
Rob Jellinghaus | "Next time you see a lie being spread or a
jellinghaus-robert@CS.Yale.EDU | bad decision being made out of sheer ignor-
ROBERTJ@{yalecs,yalevm}.BITNET | ance, pause, and think of hypertext."
{everyone}!decvax!yale!robertj | -- K. Eric Drexler, _Engines of Creation_