comp.lang.ada
 help / color / mirror / Atom feed
From: "Randy Brukardt" <randy@rrsoftware.com>
Subject: Re: Full view of a private partial view cannot be a subtype
Date: Mon, 4 Dec 2017 14:49:52 -0600
Date: 2017-12-04T14:49:52-06:00	[thread overview]
Message-ID: <p04cdg$db$1@franka.jacob-sparre.dk> (raw)
In-Reply-To: c6ba70e3-bfd0-42ca-b742-dc472965eea0@googlegroups.com

"Jere" <jhb.chat@gmail.com> wrote in message 
news:c6ba70e3-bfd0-42ca-b742-dc472965eea0@googlegroups.com...
...
>   package New_Type1 is
>      subtype Instance is Base.Instance;
>      procedure Operation(Object : in out Instance);
>
>   private
>
>      procedure Operation(Object : in out Instance) renames Base.Operation;
>   end New_Type1;
>
> (NOTE:  is there a better way to do this?)

No, no better way yet, but maybe (large maybe here) in Ada 2020. (I'm 
leaving out all details because none have been determined yet and perhaps 
never will be for Ada 2020.)

> This is all well and good, but sometimes while I as an implementer
> want this kind of relationship, I don't necessarily want to expose
> that relationship outside the private section of a package.  Here I
> run into a problem as I cannot (as far as I can tell) do:
>
>   package New_Type2 is
>      type Instance is tagged limited private;
>      procedure Operation(Object : in out Instance);
>   private
>      subtype Instance is Base.Instance;

This is illegal; a private type has to be completed with a full type, not a 
subtype. (If you have a compiler that is allowing this, it is confused...)

>      procedure Operation(Object : in out Instance) renames Base.Operation;

...which makes Instance a different type, and that makes this illegal (if 
the type declaration is written properly).

>   end New_Type2;

Usually, you're better off allowing the relationship between types to be 
visible. In that case, this happens automatically.

Otherwise, you can usually do this with this a "squirreling" rename 
(essentially, you have to rename the inherited entity before declaring the 
new one). However, in this case, you've hidden the inherited operation 
before you can rename it, so you can't do this. If you wanted a different 
operation name, it would work:

   package New_Type3 is
      type Instance is tagged limited private;
      procedure Other_Operation(Object : in out Instance);
  private
      type Instance is new Base.Instance with record ... end record;

     procedure Other_Operation(Object : in out Instance) renames 
Operation; -- (1)

  end New_Type3;

At (1), you are renaming the operation inherited from Base.Instance. That 
operation isn't visible to clients, only within this package. And it has the 
correct types.

The main use for a "squirrelling" rename is to be able to call the original 
operation in a overridden operation:

   package New_Type4 is
      type Instance is new Base.Instance with record ... end record;
      -- Operation is inherited here, with the profile:
      --procedure Operation (Object : in out Instance);
  private

     procedure Original_Operation(Object : in out Instance) renames 
Operation; -- (1)
     overriding
     procedure Operation (Object : in out Instance);
  end New_Type4;

The declaration at (1) allows the body of Operation to call the body of 
Base.Operation (but with the proper types).

                           Randy.




  parent reply	other threads:[~2017-12-04 20:49 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-12-03  2:14 Full view of a private partial view cannot be a subtype Jere
2017-12-03 12:01 ` Jeffrey R. Carter
2017-12-03 13:33   ` Jere
2017-12-03 14:34     ` Jeffrey R. Carter
2017-12-03 17:44       ` Robert Eachus
2017-12-03 18:50         ` Simon Wright
2017-12-03 22:10           ` Robert Eachus
2017-12-03 19:03         ` Jeffrey R. Carter
2017-12-03 22:23       ` Jere
2017-12-04  8:25         ` Dmitry A. Kazakov
2017-12-04 18:04         ` Jeffrey R. Carter
2017-12-04 20:41           ` Jere
2017-12-04 21:48             ` Jeffrey R. Carter
2017-12-05  8:20               ` Dmitry A. Kazakov
2017-12-05 18:16                 ` Jeffrey R. Carter
2017-12-05 20:39                   ` Dmitry A. Kazakov
2017-12-05 21:38                     ` Jeffrey R. Carter
2017-12-05 12:35               ` Jere
2017-12-05 18:40                 ` Jeffrey R. Carter
2017-12-06 12:54                   ` Jere
2017-12-06 18:03                     ` Jeffrey R. Carter
2017-12-05 20:22                 ` Randy Brukardt
2017-12-05 15:27               ` Shark8
2017-12-05 18:50                 ` Jeffrey R. Carter
2017-12-05 20:59                 ` Randy Brukardt
2017-12-05 22:43                   ` Shark8
2017-12-07  0:52                     ` Randy Brukardt
2017-12-05 20:16               ` Randy Brukardt
2017-12-05 21:29                 ` Jeffrey R. Carter
2017-12-07  0:04                   ` Randy Brukardt
2017-12-04 20:49 ` Randy Brukardt [this message]
2017-12-05 12:56   ` Jere
2017-12-05 20:12     ` Randy Brukardt
2017-12-17 15:26       ` Jere
2017-12-17 15:39         ` Dmitry A. Kazakov
2017-12-18 22:47           ` Randy Brukardt
2017-12-19  1:22             ` Jere
2017-12-19 23:16               ` Randy Brukardt
2017-12-19  1:01           ` Jere
2017-12-19  9:08             ` Dmitry A. Kazakov
2017-12-19 13:08               ` Jere
2017-12-19 13:27                 ` Dmitry A. Kazakov
2017-12-19 19:10             ` Stephen Leake
2017-12-18 20:45 ` Stephen Leake
2017-12-18 22:54   ` Randy Brukardt
2017-12-19  1:08   ` Jere
replies disabled

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