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,FREEMAIL_FROM autolearn=ham autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,35b23727c41f3e62 X-Google-Attributes: gid103376,public X-Google-ArrivalTime: 2002-07-30 08:28:51 PST Path: archiver1.google.com!news1.google.com!newsfeed.stanford.edu!canoe.uoregon.edu!arclight.uoregon.edu!news.tufts.edu!uunet!dca.uu.net!ash.uu.net!spool0901.news.uu.net!spool0900.news.uu.net!reader0901.news.uu.net!not-for-mail Date: Tue, 30 Jul 2002 11:30:50 -0400 From: Hyman Rosen User-Agent: Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:1.1b) Gecko/20020721 X-Accept-Language: en-us, en MIME-Version: 1.0 Newsgroups: comp.lang.ada Subject: Re: Multiple interface inheritance workaround in Ada 95 / Ada 0x to satisfy a Java language advocate? References: Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Organization: KBC Financial Products Message-ID: <1028042914.262359@master.nyc.kbcfp.com> Cache-Post-Path: master.nyc.kbcfp.com!unknown@mosquito.nyc.kbcfp.com X-Cache: nntpcache 3.0.1 (see http://www.nntpcache.org/) NNTP-Posting-Host: 204.253.250.10 X-Trace: 1028042930 reader1.ash.ops.us.uu.net 22029 204.253.250.10 Xref: archiver1.google.com comp.lang.ada:27485 Date: 2002-07-30T11:30:50-04:00 List-Id: Jean-Pierre Rosen wrote: > Yes. Or more exactly, the design pattern provides functions > that allow you to get an I1 or I2 view for a C object, and to > go back from an I1 or I2 view back to the original C object. > > And you are correct that this is not obvious to achieve. > That's what prompted me to make a paper of it! Going back to the original object isn't quite the same thing. It's something of a red herring since this kind of thing is extremely rarely used, but you can't claim full conformity if you don't support it. Here is what this kind of code looks like: // Java void f(I1 i1) { if (i1 instanceof I2) { I2 i2 = (I2)i1; } } // C++ void f(I1 *i1) { I2 *i2 = dynamic_cast(i1); if (i2) { /*...*/ } } As long as the underlying object has an accessible i2 in its inheritance graph, the conversion works, and the code does not need to know what the common ancestor class is, and will work for many different ancestor types. This is accomplished by compiler magic. The compiler has access to the virtual tables and can search them for the presence of appropriate bases.