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 X-Google-Thread: 103376,437103ff8a92c0df X-Google-Attributes: gid103376,public X-Google-Language: ENGLISH,ASCII-7-bit Path: g2news1.google.com!news1.google.com!fu-berlin.de!newsfeed.arcor.de!news.arcor.de!not-for-mail From: "Dmitry A. Kazakov" Subject: Re: generics and records Newsgroups: comp.lang.ada User-Agent: 40tude_Dialog/2.0.14.1 MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Reply-To: mailbox@dmitry-kazakov.de Organization: cbb software GmbH References: <1109532840.857126.234720@z14g2000cwz.googlegroups.com> <1109539865.754582.147740@o13g2000cwo.googlegroups.com> <1109581259.760277.80100@l41g2000cwc.googlegroups.com> Date: Mon, 28 Feb 2005 11:07:08 +0100 Message-ID: NNTP-Posting-Date: 28 Feb 2005 11:04:14 MET NNTP-Posting-Host: 744db308.newsread4.arcor-online.net X-Trace: DXC=oP6 On 28 Feb 2005 01:00:59 -0800, spambox@volja.net wrote: > Dmitry A. Kazakov wrote: >>>> 2. Inheritance from a record type with known components: >>>> >>>> type Common_Base is tagged record >>>> A : Float; -- This will be visible in Foo >>>> end record; >>>> >>>> generic >>>> type Record_Type is new Common_Base with private; >>>> package Foo is >>>> ... >>>> >>>> Instantiation: >>>> >>>> type My_Record is new Common_Base with record >>>> ... -- These new components will be inaccessible in Foo! >>>> end record; >>>> package My_Foo is new Foo (My_Record); > >> You can't do that. Ada has a contract model of generics. That means that >> Foo in the example above will never directly see the whole record, only its >> Common_Base part. The primitive operations defined on Common_Base will. So >> if Foo has to access all record, the only way to do it is to express what >> Foo should do in terms of primitive operations defined on Common_Base. They >> can dispatch to the specific operations defined on the actual type. >> Usually, it is sufficient for all purposes and also is a good OO-ish >> programming style. But there is no way to write a generic unit working with >> whatever components of an actual parameter. Ada does not provide abstract >> record interfaces with enumeration of components and their types at run >> time. Though you can implement something close to that using map container >> types instead of record types. Probably this is what you actually need. But >> again, to work through primitive operations is better. > > Yes, I understand. I was too eager to try your solution out, failed and > phrased my question poorly. I'm perfectly content with a record like > Common_Base above. But where should its definition be put? It can't go > into the package specs, where the "generic ..." part belongs. But if > it's not there, how can it be seen? -- "type Record_Type is new > Common_Base with private;" > andrej You can: 1. put Common_Base in another package and "with/use" that package in the generic package specification. package Bar is type Common_Base is ...; end Bar; ---------------------- with Bar; use Bar; generic type Record_Type is new Common_Base with private; package Foo is ... end Foo; 2. put both Common_Base and Foo in one package: package Bar is type Common_Base is ...; generic type Record_Type is new Common_Base with private; package Foo is ... end Foo; end Bar; 3. put Common_Base in the parent package of Foo: package Bar is type Common_Base is ...; end Bar; -------------------- generic type Record_Type is new Common_Base with private; package Bar.Foo is ... end Bar.Foo; -- Regards, Dmitry A. Kazakov http://www.dmitry-kazakov.de