comp.lang.ada
 help / color / mirror / Atom feed
From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: A bad counterintuitive behaviour of Ada about OO
Date: Sat, 9 Aug 2014 18:48:33 +0200
Date: 2014-08-09T18:48:33+02:00	[thread overview]
Message-ID: <19297tmx9dt9q.1p2p4i0odtkyw.dlg@40tude.net> (raw)
In-Reply-To: 4a3996f3-666e-404a-ad8b-ff1832751787@googlegroups.com

On Sat, 9 Aug 2014 09:11:43 -0700 (PDT), Maciej Sobczak wrote:

> On Friday, August 8, 2014 3:22:56 PM UTC+2, Dmitry A. Kazakov wrote:
> 
>>>> I still do not understand the example.
>> 
>>> http://en.wikipedia.org/wiki/Covariant_return_type
>> 
>> type A is tagged null record;
>> function getFoo return A;
> 
> Wrong. getFoo should have a factory as a parameter (in the Wikipedia
> example this is hidden as "this" parameter). More complete example would
> be:
> 
>    package Products is
>       type A is tagged null record;
>       type B is new A with null record;
>    end Products;
>    
>    package Factories is
>       type A_Factory is tagged null record;
>       function Make (AF : in A_Factory) return Products.A;
> 
>       type B_Factory is tagged null record;
>       overriding function Make (BF : in B_Factory) return Products.B;
>    end Factories;
> 
> and GNAT says:
>
>    subprogram "Make" is not overriding
>    not type conformant with declaration at line XXX
>    return type does not match

The example does not make any sense. Since it would be impossible to
dispatch on Make without knowing the type of the outcome.
 
Factory pattern in Ada is this:

   type Factory is abstract tagged null record;
   function Make (F : not null access Factory) return A'Class;

Then you do:

   type A_Factory is new Factory with ...
   override function Make (F : not null access A_Factory) return A'Class;

   type B_Factory is new Factory with ...
   override function Make (F : not null access B_Factory) return A'Class;

And in case you do know the result type no factory object is ever needed,
because you just do:

   X : A;

> As Randy pointed out, this cannot work in Ada. It's not even a matter of "fixing" something.

It cannot work in any language, even if full MD were supported, which would
make your example possible. The pattern is just useless.

>> If you are in the hierarchy of the factory
>> type, there cannot be any covariance in an unrelated hierarchy.
> 
> This is *exactly* the definition of covariance, at least the one I know:

The notion of co- and contra-variance was given by Luca Cardelli. It is
related strictly to inheritance <=> a hierarchy. Outside a hierarchy it is
just meaningless.

>> No OOPL I know can handle this.
> 
> Have you heard about those niche and unpopular languages like C++ and Java? ;-)

Yes. They cannot handle this either.

Usual technique in C++ and Ada is to use template or generic to produce the
handle type. It is quite nasty and it loses the second hierarchy (of
handles). 

-- 
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de

  reply	other threads:[~2014-08-09 16:48 UTC|newest]

Thread overview: 73+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-08-05 20:09 A bad counterintuitive behaviour of Ada about OO Victor Porton
2014-08-05 20:58 ` Simon Wright
2014-08-05 21:06   ` Victor Porton
2014-08-05 21:51     ` Niklas Holsti
2014-08-05 22:13       ` Victor Porton
2014-08-05 22:35   ` Victor Porton
2014-08-05 23:25     ` Adam Beneschan
2014-08-05 20:59 ` Dmitry A. Kazakov
2014-08-05 21:07   ` Victor Porton
2014-08-05 22:39     ` Shark8
2014-08-05 21:11   ` Victor Porton
2014-08-06  7:26     ` Dmitry A. Kazakov
2014-08-07  7:41       ` Maciej Sobczak
2014-08-07  8:50         ` Dmitry A. Kazakov
2014-08-08  7:54           ` Maciej Sobczak
2014-08-08  8:14             ` Dmitry A. Kazakov
2014-08-08 13:06               ` Maciej Sobczak
2014-08-08 13:22                 ` Dmitry A. Kazakov
2014-08-08 22:32                   ` Randy Brukardt
2014-08-09 16:11                   ` Maciej Sobczak
2014-08-09 16:48                     ` Dmitry A. Kazakov [this message]
2014-08-10 20:55                       ` Maciej Sobczak
2014-08-11  7:41                         ` Dmitry A. Kazakov
2014-08-11  7:58                           ` Maciej Sobczak
2014-08-11  8:23                             ` Dmitry A. Kazakov
2014-08-12  7:50                               ` Maciej Sobczak
2014-08-11 11:35                             ` G.B.
2014-08-08 22:26                 ` Randy Brukardt
2014-08-08  8:34             ` Shark8
2014-08-08 12:59               ` Maciej Sobczak
2014-08-08 22:37                 ` Randy Brukardt
2014-08-08 22:53                   ` Jeffrey Carter
2014-08-07  8:58         ` J-P. Rosen
2014-08-07  9:40           ` Dmitry A. Kazakov
2014-08-07 11:17             ` J-P. Rosen
2014-08-07 12:28               ` Dmitry A. Kazakov
2014-08-07 13:34                 ` J-P. Rosen
2014-08-07 16:10                   ` Dmitry A. Kazakov
2014-08-07 18:14                     ` Robert A Duff
2014-08-07 19:41                       ` Dmitry A. Kazakov
2014-08-07 20:53                         ` Robert A Duff
2014-08-08  7:43                           ` Dmitry A. Kazakov
2014-08-08  8:18                             ` Shark8
2014-08-08  7:45                     ` J-P. Rosen
2014-08-08  8:04                       ` Dmitry A. Kazakov
2014-08-08  8:55                         ` J-P. Rosen
2014-08-08  9:13                           ` Dmitry A. Kazakov
2014-08-08 10:01                             ` J-P. Rosen
2014-08-08 10:53                               ` Dmitry A. Kazakov
2014-08-08 10:56                                 ` Victor Porton
2014-08-08 12:00                                 ` J-P. Rosen
2014-08-08 13:11                                   ` Dmitry A. Kazakov
2014-08-08 13:53                                     ` J-P. Rosen
2014-08-08 20:23                                       ` Dmitry A. Kazakov
2014-08-07 20:29                   ` Shark8
2014-08-08  7:49                     ` J-P. Rosen
2014-08-08  8:12                       ` Shark8
2014-08-08  8:26                         ` Dmitry A. Kazakov
2014-08-08 11:10                           ` Shark8
2014-08-08 11:20                             ` Dmitry A. Kazakov
2014-08-08 19:34                               ` Shark8
2014-08-08 20:23                                 ` Dmitry A. Kazakov
2014-08-07 15:03           ` Jeffrey Carter
2014-08-08  7:48           ` Maciej Sobczak
2014-08-08  8:51             ` J-P. Rosen
2014-08-08 13:25               ` Maciej Sobczak
2014-08-08 13:34                 ` J-P. Rosen
2014-08-08 13:52                   ` Dmitry A. Kazakov
2014-08-08 14:21                     ` J-P. Rosen
2014-08-08 20:23                       ` Dmitry A. Kazakov
2014-08-08 22:08                     ` Randy Brukardt
2014-08-08 22:18                 ` Randy Brukardt
2014-08-06  4:50 ` Per Sandberg
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox