comp.lang.ada
 help / color / mirror / Atom feed
From: "Randy Brukardt" <randy@rrsoftware.com>
Subject: Re: Two questions
Date: Fri, 9 Mar 2001 14:56:00 -0600
Date: 2001-03-09T14:56:00-06:00	[thread overview]
Message-ID: <Aubq6.4262$7e6.1669484@homer.alpha.net> (raw)
In-Reply-To: Eg9q6.4382$pR3.821782@news2-win.server.ntlworld.com

chris.danx wrote in message ...
>Hi,
>    two questions, one on exceptions and one on objects or tagged
types.
>
>Where exactly can i put an exception handler?  I read in JE's book that
you
>can put them in loop ... end loop statements after an exit statement.
I
>normally put handlers at the end of a routine, and i was supprised to
find
>you could put them elsewhere.  What i want to know is where else can i
put
>them?  In a while loop?  In a for loop?  In an if?  ... etc.


You can't add a handler to a loop, for instance. But, you can put an
exception handler on a block. And a block is a statement. So,
effectively, you can put an exception handler anywhere you can put a
statement.  For instance:

    loop
      begin
           <stuff..>
     exception
           ....
     end;
   end loop;


>The second is to do with tagged types.  Sometimes it is suggested that
you
>put your 'create routine' -- the initialisation routine -- in a nested
>package.  Others suggest putting it in the same package as the tagged
type.
>
>Example
>
>package something_cool is
>
>    type cool is tagged private;
>
>    package constructor is
>
>        procedure create (c : out cool; ... ... );
>
>    end constructor;
>
>    private
>        ...
>        ...
>
>end something_cool;
>
>or
>
>package something_cool is
>
>    type cool is tagged private;
>
>    procedure create (c : out cool; ... ... );
>
>    private
>        ...
>        ...
>
>end something_cool;
>
>
>What's the difference?  Where should i use method 1 and where should i
use
>method 2?


When you have the nested package, the constructor is not inherited when
the type is derived. (In RMese, it isn't a primitive operation of the
type.) Typically, each constructor has a separate set of parameters, and
you don't want the same parameters on the constructor for each type. Ada
95 doesn't let you delete operations that are inherited, so you have to
prevent them from being inherited in the first place.

The alternative (which we use in Claw) is to override *all* inherited
constructors, and either make them work or raise an exception. But that
only works well with a shallow inheritance structure; a deeper structure
could end up with dozens of useless constructors inherited.

            Randy.






  parent reply	other threads:[~2001-03-09 20:56 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2001-03-09 18:27 Two questions chris.danx
2001-03-09 20:22 ` Mark Lundquist
2001-03-09 20:56 ` Randy Brukardt [this message]
2001-03-12 15:36 ` John English
2001-03-12 18:11   ` chris.danx
  -- strict thread matches above, loose matches on Subject: below --
2002-07-04 22:25 Mark
2002-07-04 22:40 ` Jeffrey Creem
2001-03-12 10:59 Christoph Grein
2001-03-12 17:43 ` Stephen Leake
1996-11-09  0:00 tmoran
1996-11-11  0:00 ` Adam Beneschan
1996-11-13  0:00 ` Richard A. O'Keefe
1996-11-07  0:00 Ding-yuan Sheu
1996-11-07  0:00 ` Robert Dewar
1996-11-08  0:00 ` Jon S Anthony
1996-11-08  0:00 ` Norman H. Cohen
1996-11-08  0:00 ` Robert I. Eachus
1996-05-01  0:00 Bernard Banner
1996-05-01  0:00 Ed Seidewitz
1996-05-01  0:00 W. Wesley Groleau (Wes)
1989-04-11 13:32 Piercarlo Grandi
1989-04-14 17:14 ` callen
1989-03-30 11:53 Piercarlo Grandi
1989-04-13  0:46 ` Paul Stachour
1989-03-29  9:16 HansM
1989-03-29 18:35 ` Michael Peirce
1989-03-31 13:10 ` stt
1989-03-31 18:59 ` Scott Simpson
1989-04-03 14:44 ` callen
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox