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=-1.9 required=5.0 tests=BAYES_00 autolearn=ham autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,30821ecf97416798 X-Google-Attributes: gid103376,public X-Google-ArrivalTime: 2001-09-25 05:41:03 PST Path: archiver1.google.com!newsfeed.google.com!newsfeed.stanford.edu!paloalto-snf1.gtei.net!chcgil2-snh1.gtei.net!cpk-news-hub1.bbnplanet.com!news.gtei.net!newsfeed1.cidera.com!Cidera!sjcppf01.usenetserver.com!e420r-sjo4.usenetserver.com!usenetserver.com!e420r-atl1.usenetserver.com.POSTED!not-for-mail From: "Anthony E. Glover" Newsgroups: comp.lang.ada References: <1bJr7.11813$po4.573186@e420r-atl1.usenetserver.com> Subject: Re: How Can I Create A Class Dynamically X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 6.00.2479.0006 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2479.0006 Message-ID: <3U_r7.369$SJ3.136882@e420r-atl1.usenetserver.com> X-Complaints-To: abuse@usenetserver.com X-Abuse-Info: Please be sure to forward a copy of ALL headers X-Abuse-Info: Otherwise we will be unable to process your complaint properly. NNTP-Posting-Date: Tue, 25 Sep 2001 08:37:19 EDT Organization: WebUseNet Corp. - "ReInventing The UseNet" Date: Tue, 25 Sep 2001 07:40:56 -0500 Xref: archiver1.google.com comp.lang.ada:13320 Date: 2001-09-25T07:40:56-05:00 List-Id: Thanks for the suggestion. I will give it a try. Tony "Samuel Tardieu" wrote in message news:mailman.1001350161.22792.comp.lang.ada@ada.eu.org... > On 24/09, Anthony E. Glover wrote: > > | I have a class hierarchy defined and I would like to be able to read a > | string and then dynamically creating a pointer to an object of the type > | specified by the string. Similar I think to class loading and class > | factories in Java. Can this be done in Ada95. If so, how. I have looked at > | the Ada.Tags packages and this looks like it might be helpfull, but I'm not > | quite sure how to make use of it. I would basically like to be able to avoid > | having to specify a case statement or if block when initially creating my > | objects. > > Let's assume that the root of your hierarchy is called Root. > > One modular and portable way which would work with any language supporting > elaboration would be to: > > - have a package (probably using a protected object behind the scene) which > exports a Register subprogram such as: > > type Root_Access is access all Root'Class; > type Factory is access function return Root_Access; > procedure Register (Name : String; F : Factory); > > Register would use a hash table to associate names to factories. > > - in this package, also have a Create subprogram looking like: > > function Create (Name : String) return Root_Access; > > whose body would look like: > > return Lookup (Name) .all; > > (with of course added checks) where Lookup looks up in the hash table > > - have each type register itself during the elaboration by declaring > a factory function and registering it using Register > > This way, you get a factory which knows only the types present in your > final application. > > Note that you are likely to run into elaboration issues with the root type > if your "factory-like package" is not the same as the one where the root > type is declared. > > If your root type is abstract (or more generally if it cannot be used with > a factory), then you can more easily solve elaboration problems. Also, it > may be worth making a generic package to implement this solution. > > HopI hope you got the idea.e this helps. > > Sam >