From: Jere <jhb.chat@gmail.com>
Subject: Preventing private procedure visibility being made public through extension
Date: Sat, 20 May 2017 10:33:26 -0700 (PDT)
Date: 2017-05-20T10:33:26-07:00 [thread overview]
Message-ID: <bd5b3107-709d-46b9-b29b-fd15e8a6e265@googlegroups.com> (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"
next reply other threads:[~2017-05-20 17:33 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-05-20 17:33 Jere [this message]
2017-05-20 20:13 ` Preventing private procedure visibility being made public through extension 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
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox