comp.lang.ada
 help / color / mirror / Atom feed
* Preventing private procedure visibility being made public through extension
@ 2017-05-20 17:33 Jere
  2017-05-20 20:13 ` AdaMagica
                   ` (2 more replies)
  0 siblings, 3 replies; 42+ messages in thread
From: Jere @ 2017-05-20 17:33 UTC (permalink / raw)


I tried to whittle this down to a small example, so forgive 
the uselessness of the example itself.  I'm extending a 
library with some of my own components and I want (if possible) 
to allow my components to interact with the other library 
components as seamlessly as possible.

Say a library provides a tagged type with the following procedure:

Base.ads
*************************************************
package Base is
   
   type Base_Param is tagged null record;
   
   type Base_Type is tagged null record;
   
   procedure Something
      (Obj : in out Base_Type; 
       Value : Base_Param'Class) 
   is null;
   
end Base;

*************************************************

keep in mind declaring the procedure as "is null" is 
just for example sake. In real life it would have a body.

I want to extend both of the types in that package to do some 
extra processing.  In particular, I want to override the 
procedure Something so that it does more than the version 
for Base_Type and so it takes in my derived param class as a
parameter.  I also want to prevent a client from calling the 
inherited version of the procedure Something as it would 
bypass the code I have in my new prototype of the procedure.

I declare the package like this:

Derived.ads
*************************************************
with Base;

package Derived is
   
   type Derived_Param is new Base.Base_Param with null record;
   
   type Derived_Type is new Base.Base_Type with private;
   
   procedure Something
      (Obj : in out Derived_Type; 
       Value : Derived_Param'Class)
   is null;
   
   type More_Derived_Type is new Derived_Type with private;
   
private
   
   type Derived_Type is new Base.Base_Type with null record;
   
   overriding
   procedure Something
      (Obj : in out Derived_Type; 
       Value : Base.Base_Param'Class) 
   is null;
   
   type More_Derived_Type is new Derived_Type with null record;
   
end Derived;

*************************************************

Again, keep in mind this is a simplified example.  
The procedures would do something and the extended 
types would have other params.

This is all well and good.  Variables of Derived_Type 
can only call the version of something that I specified 
publicly and the overriden one cannot be called.

However, variables of More_Derived_Type have public 
visibility to both versions of Something.  I would 
have hoped that the version hidden by Derived_Type 
would keep it hidden, but extending the type makes
the private procedure visible again.

Example main:

main.adb
*************************************************
with Base;
with Derived; use Derived;

procedure Main is
   p : Derived_Param;
   d : Derived_Type;
   m : More_Derived_Type;
begin
   d.Something(p);  -- Works as expected
   m.Something(p);  -- Causes an error due to ambiguity
end Main;
*************************************************

Is there a way for me to prevent extending types from making
the procedure public again?

The error is ambiguous call to "Something"


^ permalink raw reply	[flat|nested] 42+ messages in thread

end of thread, other threads:[~2018-05-20 12:03 UTC | newest]

Thread overview: 42+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-05-20 17:33 Preventing private procedure visibility being made public through extension Jere
2017-05-20 20:13 ` AdaMagica
2017-05-20 21:55   ` Jere
2017-05-20 20:32 ` Dmitry A. Kazakov
2017-05-20 22:51   ` Jere
2017-05-21  0:51     ` Jere
2017-05-21  9:16       ` Chris Moore
2017-05-21 22:55         ` Jere
2017-05-21  8:44     ` Dmitry A. Kazakov
2017-05-21 12:19       ` J-P. Rosen
2017-05-21 12:53         ` Dmitry A. Kazakov
2017-05-21 20:06       ` Jere
2017-05-21 21:07         ` Dmitry A. Kazakov
2017-05-21 22:28           ` Jere
2017-05-22  8:52             ` Dmitry A. Kazakov
2017-05-22 13:33               ` AdaMagica
2017-05-22 13:43           ` AdaMagica
2017-05-22 21:17         ` Randy Brukardt
2017-05-25  4:06           ` Jere
2017-05-25 19:39             ` Randy Brukardt
2017-05-25 22:53               ` Jere
2017-05-25 22:57                 ` Jere
2017-05-26 20:46                 ` Randy Brukardt
2017-05-26 22:35                   ` Simon Wright
2018-05-20 11:22                     ` Simon Wright
2018-05-20 12:03                       ` Jere
2017-05-26 22:58                   ` Jeffrey R. Carter
2017-05-30 21:15                     ` Randy Brukardt
2017-06-02  1:07                       ` Jere
2017-06-02  7:31                         ` Dmitry A. Kazakov
2017-06-02  8:09                         ` Mark Lorenzen
2017-06-02 11:31                         ` Simon Wright
2017-05-22 21:12   ` Randy Brukardt
2017-05-23  7:38     ` Dmitry A. Kazakov
2017-05-21 18:14 ` Robert Eachus
2017-05-21 20:21   ` Jere
2017-05-21 21:09     ` Jeffrey R. Carter
2017-05-21 22:46       ` Jere
2017-05-22 21:24         ` Jeffrey R. Carter
2017-05-25  3:45           ` Jere
2017-05-21 21:20     ` Dmitry A. Kazakov
2017-05-21 21:45       ` Jere

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