Re: Clean Object Class Design -- Circle/Ellipse

From: Jan Hidders <hidders_at_REMOVE.THIS.win.tue.nl>
Date: 7 Aug 2001 09:03:51 GMT
Message-ID: <9koatn$6q$1_at_news.tue.nl>


Mikito Harakiri wrote:
> hidders_at_REMOVE.THIS.win.tue.nl (Jan Hidders) wrote in message
> news:<9klpmg$3dg$1_at_news.tue.nl>...
> > To summarize:
> >
> > Assume you have a finite set of domains Dom = { D_1, .., D_n }
>
> Can't we collapse this to just 2 domains, as I have trouble counting?
> D_Super and D_Sub? (Where Super is 0 and Sub is "an arbitrary big
> number";-)

I also seem to have problems counting because the last domain should be D_m (there's no reason why the number of domains should be equal to the number functions).

> > and a
> > } finite set of function Fun = { f_1,..., f_n } over these
> > domains (with some of them the same name but over different domains).
> > If you assume a subtype ordering, here called <=, over the domains
> > then there are two things that should hold.
> >
> > 1. The first is that if D_i <= D_j then there is a function I[D_i,D_j]
> > : D_i -> D_j that "interprets" elements of D_i as elements of D_j.
>
> I would suggest I[Real,Integer] mapping any real r into integer i as
> follows:
>
> i = floor(r)

That would be the wrong way around because then you would try to make the Reals a subtype of Integer.

> > 2. The second is that the semantics of the functions should respect the
> > subtype ordering and this interpretation function. This means that
> > if you have two function f_i : D_i -> C_i and f_j : D_j -> C_j with
> > the same name and a greatest common subtype D' exists of D_i and D_j
> > and a greatest common supertype C' of C_i and C_j exists, then if we
> > interpreat f_i and f_j as functions from D' to C' then they must be
> > the same, i.e., for all x in D' it holds that
> >
> > I[C_i,C']( f_i( I[D',D_i](x) ) ) = I[C_j,C']( f_j( I[D',D_j](x) ) )
> >
> > So if you tell me what operations you have over the integers and the
> > reals, and what your subtype interpreations is, then I can tell you if
> > a subtyping relation between them is valid.
>
> Again, couldn't this condition be formulated in terms of super- and
> subclass only?

No. You have to make a statement about the semantics that says something like "if I have an expression with operators and constants then the meaning of this expression does not depend upon what sub- or supertypes I assign to them". Since this is a semantical expression you have to say something about the semantics and/or the axioms that define your functions.

It looks a lot more difficult then it really is. Suppose you have the integer plus (I+) and the real plus (R+), and the (in some sense) trivial mapping I[Int,Real] : Int -> Real, then it says that 1 + 1 has always the same meaning, i.e., the result is the same if I first convert the 1's to 1.0's and then use R+ or if I immediately apply I+ and convert the result to a Real. In formulas:

  I[Int,Real](1) R+ I[Int,Real](1) = I[Int,Real](1 I+ 1)

> > For starters lets assume for the Reals (R,+,*) and for the Integers
> > (I,+,*). So we have the domains R and I and the operators + : R x R ->
> > R, * : R x R -> R, + : I x I -> I and + : I x I -> I. And because I
> > have to get back to work now, checking that we can indeed regard the
> > integers as a subtype of the reals is left as an exercise for the
> > reader. :-)
>
> With "I" being i = floor(r), couldn't reals be a subclass of integers?

Well, let's see, it should hold for all Reals x, y that,

  floor(x) I+ floor(y) = floor(x R+ y)

Yes, it holds, so they could, if this is your only operator. :-) But.... usually you also have an equality operator R= : R x R -> Bool and I= : I x I -> Bool and then it should also hold that,

  (floor(x) I= floor(y)) = (x R= y)

and that doesn't hold. So if you have equality operators (and you almost always have) then the interpretation function I[SubDom,SupDom] L SubDom -> SupDom must be injective.

-- 
  Jan Hidders
Received on Tue Aug 07 2001 - 11:03:51 CEST

Original text of this message