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-Thread: 103376,437103ff8a92c0df X-Google-Attributes: gid103376,public X-Google-Language: ENGLISH,ASCII-7-bit Path: g2news1.google.com!postnews.google.com!l41g2000cwc.googlegroups.com!not-for-mail From: spambox@volja.net Newsgroups: comp.lang.ada Subject: Re: generics and records Date: 28 Feb 2005 01:00:59 -0800 Organization: http://groups.google.com Message-ID: <1109581259.760277.80100@l41g2000cwc.googlegroups.com> References: <1109532840.857126.234720@z14g2000cwz.googlegroups.com> <1109539865.754582.147740@o13g2000cwo.googlegroups.com> NNTP-Posting-Host: 82.192.62.228 Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" X-Trace: posting.google.com 1109581264 14140 127.0.0.1 (28 Feb 2005 09:01:04 GMT) X-Complaints-To: groups-abuse@google.com NNTP-Posting-Date: Mon, 28 Feb 2005 09:01:04 +0000 (UTC) In-Reply-To: User-Agent: G2/0.2 Complaints-To: groups-abuse@google.com Injection-Info: l41g2000cwc.googlegroups.com; posting-host=82.192.62.228; posting-account=sjoIww0AAACsQsohcnPenkRLTMgYA84g Xref: g2news1.google.com comp.lang.ada:8525 Date: 2005-02-28T01:00:59-08:00 List-Id: 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