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: Tue, 5 Dec 2017 14:12:41 -0600
Date: 2017-12-05T14:12:41-06:00	[thread overview]
Message-ID: <p06ujp$1kf$1@franka.jacob-sparre.dk> (raw)
In-Reply-To: 5b32a99e-04e5-4adb-8b42-88e485570641@googlegroups.com

"Jere" <jhb.chat@gmail.com> wrote in message 
news:5b32a99e-04e5-4adb-8b42-88e485570641@googlegroups.com...
> On Monday, December 4, 2017 at 3:49:54 PM UTC-5, Randy Brukardt wrote:
>> "Jere" wrote in message
>> ...
>> >   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.)
>
> Sounds intriguing!
>
>>
>> > 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...)
>
> Yep, that was my comment.  Basically I have a low level package that is 
> used
> to create many higher level, more client friendly packages:
>
> generic
>   type Input_Type(<>);
>   with procedure Really_Dangerous_To_Call(Object : Input_Type);
>   Value : Integer;
> package Low_Level_Package
>
>   type My_Type is private;
>   type Numeric_Type is <some implementation using Value>;
>
>   function Client_Friendly_Procedure
>     (Object : My_Type)
>      return Numeric_Type;
>
>   <other operations>
>
> private
>   ...
>
> end Low_Level_Package;
>
> and I want to use it to make some more client friendly versions.
> The procedure, Really_Dangerous_To_Call, isn't meant to be called
> directly for a client.  It is meant to be used to setup implementations
> behind the client packages.

If you control the entire design of the type hierarchy, the best way to do 
this is to put "Really_Dangerous_to_Call" into the private part of the root 
operation, and declare the child types in child packages. Then, the child 
types can call the routine but clients cannot. (An added advantage is that 
Really_Dangerous_to_Call can be dispatching in such a design.)

Claw is organized this way, so it's pretty certain that Ada compilers can 
properly process such an organization.

This looks something like:

    package Claw is
        ... -- Hundreds of lines of other stuff...

        type Root_Window_Type is abstract tagged private; -- Actually, 
derived from Controlled.

        ... -- Public dispatching operations available for all Windows, like 
Move, Resize, etc.

   private

        procedure Really_Dangerous_to_Call (Window : in out 
Root_Window_Type);

        -- Other private dispatching operations and the full declaration of 
Root_Window_Type.
   end Claw;

   package Claw.Basic is
        type Basic_Window_Type is new Root_Window_Type with private;

        ... -- Public for Basic_Windows, including those available for all 
Windows, like Move, Resize, etc.

   private

        -- Can override Really_Dangerous_to_Call here, if needed.

   end Claw.Basic;

The body of Claw.Basic can call Really_Dangerous_to_Call if needed, but 
clients can't. If you only need class-wide operations, you can also do this 
with a private package (which then can only be withed by children of the 
parent package, and not visibly).

Claw uses this to hide the actual message handlers from the clients (so the 
client can't mess them up), and uses dispatching to call them (so each Claw 
type can have a custom message handler if needed -- and it is usually 
needed).

                                      Randy.



  reply	other threads:[~2017-12-05 20:12 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
2017-12-05 12:56   ` Jere
2017-12-05 20:12     ` Randy Brukardt [this message]
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