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,436e4ce138981b82 X-Google-Attributes: gid103376,public X-Google-ArrivalTime: 2004-03-11 01:59:14 PST Path: archiver1.google.com!news2.google.com!fu-berlin.de!uni-berlin.de!tar-meneldur.cbb-automation.DE!not-for-mail From: Dmitry A. Kazakov Newsgroups: comp.lang.ada Subject: Re: abstract sub programs overriding Date: Thu, 11 Mar 2004 11:09:50 +0100 Message-ID: References: <1078776213.376775@master.nyc.kbcfp.com> <1078839257.157439@master.nyc.kbcfp.com> <5cmr40t76va200betf07b7bd6er05ltto9@4ax.com> <1078845298.702789@master.nyc.kbcfp.com> <0ipr40thtf86b520a0qdi003aj87gtuhd4@4ax.com> <1078849973.701176@master.nyc.kbcfp.com> <1078924150.268074@master.nyc.kbcfp.com> NNTP-Posting-Host: tar-meneldur.cbb-automation.de (212.79.194.119) Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Trace: news.uni-berlin.de 1078999152 67701953 I 212.79.194.119 ([77047]) X-Newsreader: Forte Agent 1.8/32.548 Xref: archiver1.google.com comp.lang.ada:6229 Date: 2004-03-11T11:09:50+01:00 List-Id: On Wed, 10 Mar 2004 08:08:56 -0500, Hyman Rosen wrote: >Dmitry A. Kazakov wrote: >> To allow /= to force. To re-dispatch in Ada you have do it expilictly >> by converting the object of a specific type to a class-wide. This is >> way different (though also problematic) from inconsistent attempts in >> C++ to view the same thing as both specific and class-wide. This >> cannot be reconciled. > >In C++ you can also choose whether to dispatch or not, but the default >is to dispatch. If you want to call a function of a particular class, >you just specify that (eg., Mumble::Foo()) and you get it. To dispatch vs. not has to be defined by solely the object type. This is the only right way, IMO, and Ada conforms to it. >Remember, >Ada compilers still use a vtable pointer inside each object, not the >way you would have it, a two-part object/vtable fat pointer. That tags are embedded in Ada is a consequence of a desire to have re-dispatch and more generally to have objects with identity. Though as practice shown it was not needed, because the Rosen trick does the same and has the advantage of explicit indication that identity is indeed relevant. However the Ada concept of specific and class-wide types as different types is one of rare real advances in that swamp called OO. And yes, the concept could be used for non-tagged types having the best of both worlds. >> Huh. So the common point of view is that dispatching on unconstructed >> objects is good? > >As I said, not in C++. But much fuss has been made of claiming that >C++'s way of dispatching in *tors is "confusing" and there are also >people who want constructors to be able to easily condition their >behavior based on the complete type of the object. So Java, and Ada >too, I suppose, do a two-step initialization. The bits of the object >are perhaps set to something marginally non-random (in Java it's all >bits zero; you describe what Ada does below) and then methods are on >their own to worry about whether things are ready to be used. > >> Note also that in Ada it cannot happen. > >Really? What if you have a hierarchical class where each base has its >own Initialize? Is each version responsible for calling the version of >its base? Yes, but Initialize is not a constructor in C++ sense. When Ada will have [first stage] constructors that responsibility will become one of the compiler. >What is to keep a base version from converting to classwide >type and calling a dispatching method which will try to use an unset >member of the derived class (eg., a file not yet opened)? That will be difficult to achieve with controlled types because they have *reverse* order of calls to Initialize, but I understand the question. When objects are constructed in two stages, the first stage makes some basic initialization in a way that a base knows nothing about children. This initialization *cannot* be overriden by children, only extended. C++ tries to be conform with that, but it has an unsolvable problems of its messing with specific vs. class-wide. At this stage no dispatch is needed and no surprises to expect. This exists in Ada, but it is not user-definable, yet. The second stage construction can be made class-wide, so that a base could dispatch from its constructor to child methods. Note that this construction should be made in a reverse order - children first, exactly as Initialize in Ada works. That makes dispatch in base's Initialize safe. To summarize: 1. The first stage constructs a *specific* instance of a Derived_Type, descendant of Type, out of a raw memory chunk. It creates an object of the type Derived_Type, but that might be not a valid instance of Type'Class. This makes 2. the second stage by constructing Type'Class out of Derived_Type. Returning to your example, if Type is an abstract type, and Derived_Type has to have File, accessed by Type via some dispatching method, then File (a handle to) has to be initialized and opened at the stage one, and the class-wide constructor of Type may safely use it at the stage two. IMO Ada model is very close to that. -- Regards, Dmitry Kazakov www.dmitry-kazakov.de