From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-0.3 required=5.0 tests=BAYES_00, REPLYTO_WITHOUT_TO_CC autolearn=no autolearn_force=no version=3.4.4 Path: eternal-september.org!reader01.eternal-september.org!reader02.eternal-september.org!news.eternal-september.org!mx02.eternal-september.org!feeder.eternal-september.org!aioe.org!.POSTED!not-for-mail From: "Dmitry A. Kazakov" Newsgroups: comp.lang.ada Subject: Re: I'm facing an issue with: call to abstract procedure must be dispatching Date: Tue, 8 Dec 2015 18:42:04 +0100 Organization: cbb software GmbH Message-ID: <5hfb2q9imjfu.zs3xp9gxw0d3.dlg@40tude.net> References: <8bc7fd76-f00a-4eea-9715-470af028fc84@googlegroups.com> <1krm4xun4e4ny.jmh9kvf6s0a9.dlg@40tude.net> <12dc7aea-933d-4271-95bd-10df808917e4@googlegroups.com> Reply-To: mailbox@dmitry-kazakov.de NNTP-Posting-Host: Sfz0eNwKWh4Uq03iti+GMw.user.speranza.aioe.org Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Complaints-To: abuse@aioe.org User-Agent: 40tude_Dialog/2.0.15.1 X-Notice: Filtered by postfilter v. 0.8.2 Xref: news.eternal-september.org comp.lang.ada:28712 Date: 2015-12-08T18:42:04+01:00 List-Id: On Tue, 8 Dec 2015 09:24:58 -0800 (PST), Serge Robyns wrote: > On Tuesday, 8 December 2015 18:05:09 UTC+1, Dmitry A. Kazakov wrote: > >> The_Store : aliased T_Store; >> Client : T_Client; >> begin >> The_Store.Insert (Client); > > Yes, I know this does work. I did compile the example first like that. > But this is an attempt to "simplify" the problem to post it here. What > really happens is the following. > > In the main package I'm actually calling other packages passing the > The_Store. For example: > > -- with Store.Gnatcoll_version; > with Store.Inmemory_Container_version; > > Both implement the same interface but with different underlying storage. > In the case of in_memory, I'll keep containers inside the type T_Data_Store > and in case of Gnatcoll some DB parameters inside T_Data_Store > and then ... > > Do_Something (The_Store); > > The signature of Do_Something is > procedure Do_Something (A_Store : in out T_Abstract_Store); In which relation is Do_Something to T_Abstract_Store? 1. a primitive operation = has a separate implementation for each concrete type (from the class) 2. class-wide operation = has same implementation for all types (from the class) (anything else is a design fault) > Inside that procedure I'm using the A_Store. This regardless how A_Store > got implemented. That sounds like #2. Then it must be declared as: procedure Do_Something (A_Store : in out T_Abstract_Store'Class); > However all "users" will just call "A_Store.Insert (Something);" or > "Something := A_Store.Get (ID);", etc. You lost me here. What has this to do with Do_Something? > If I've to use the "real" instance, I've to edit all packages that > "with"'s depending on the case. In some languages this could controlled > by a pre-processor directive. Any other suggestion? I don't understand the problem. You are trying to explain a [failed] solution of some problem. I would suggest you to start with the problem. -- Regards, Dmitry A. Kazakov http://www.dmitry-kazakov.de