comp.lang.ada
 help / color / mirror / Atom feed
From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: Ada Interfaces and the Liskov Substitution Principle
Date: Sat, 26 May 2007 09:48:38 +0200
Date: 2007-05-26T09:48:30+02:00	[thread overview]
Message-ID: <1k165n4jwxna3$.1mpx49xvcrc0z$.dlg@40tude.net> (raw)
In-Reply-To: 1180124867.710641.176330@k79g2000hse.googlegroups.com

On 25 May 2007 13:27:47 -0700, Maciej Sobczak wrote:

> On 25 Maj, 10:21, "Dmitry A. Kazakov" <mail...@dmitry-kazakov.de>
> wrote:
> 
>>> Interesting. In most of the cases, the factory function creates the
>>> object of whatever type *it* decides (based on its parameters or some
>>> other input values) and initializes the class-wide type accordingly.
>>
>> Not necessarily. In one case, I generate nodes of a graph. The nodes can be
>> of different types regarding their persistence. For example, there are
>> nodes resident in the database and nodes resident in the memory etc. Now,
>> when creating a new node a factory moves along two axes: the standard
>> root/branch/leaf hierarchy and persistence stuff. For the latter the
>> factory receives an already existing node, to create "a new node like
>> this." This is not copying. Ideally it should double dispatching along both
>> axes. I have implemented it as:
>>
>>    New_Node := Create (Get_Factory (Some_Existing_Node), ...);
> 
> Above, it is the factory function that is "parameterized" on the left-
> hand type

and the right-hand one, which was the point. But it would be enough to give
just two examples, one for LHS, another for RHS:

   X : T;
begin
   X := Read_From_File;  --- LHS
  return  X; -- RHS in the caller

> - this is still much different from assignment_statement
> (wow!) between two class-wide types.

How is it different? Note that there is little room for how to define
assignment. Within a type hierarchy there are only four variants:

T'Class x T'Class  -- non-dispatching
T x T'Class  -- dispatches on the target (C++)
T'Class x T' -- dispatches on the source
T x T -- Fully dispatching (Ada*)

In all cases X:=Y will be legal on two class-wide objects.

> I'm still for banning it.

For this you have to make assignment contravariant (non-primitive
operation) in one of its arguments. That would be a total mess, because it
would require overloading assignment for each derived type.

For the same reason all signatures with a class-wide parameter are bad,
because they lead to ambiguities in trivial cases:

type S is new T with ...;
X, Y : S;

X := Y;  -- S'Class x S'Class vs T'Class x T'Class?

You will need some sort of dominance rules to resolve that.

P.S. Probably you have in mind a "stratified" assignment which statically
checks that LHS and RHS are of the same type. Ada has it as well. This is
achieved by types cloning upon derivation:

type My_Float is new Float range ...;
-- equivalent to
-- subtype Anonymous is My_Float range ...; -- Same hierarchy
-- type My_Float is new Anonymous; -- Clone it

Unfortunately, which IMO was a big mistake, this mechanism war prohibited
for tagged types.

-----------
*  Ada's assignment is doubly dispatching. The dispatching table is a
square, the diagonal of consists of thunks:

   Finalize (LHS);
   bit-copy (LHS, RHS);
   Adjust (LHS);

Non-diagonal elements are:

   raise Constraint_Error;

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



  reply	other threads:[~2007-05-26  7:48 UTC|newest]

Thread overview: 81+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-05-23 19:47 Ada Interfaces and the Liskov Substitution Principle Stefan Lucks
2007-05-23 20:32 ` Ludovic Brenta
2007-05-23 22:00   ` Randy Brukardt
2007-05-24  0:56     ` Anh Vo
2007-05-24 18:27     ` Pascal Obry
2007-05-24 18:39       ` Dmitry A. Kazakov
2007-05-24 18:51         ` Pascal Obry
2007-05-24 22:44         ` Randy Brukardt
2007-05-24  6:57   ` Stefan Lucks
2007-05-23 20:54 ` Maciej Sobczak
2007-05-23 21:58   ` Randy Brukardt
2007-05-24  7:29     ` Maciej Sobczak
2007-05-24  8:02       ` Dmitry A. Kazakov
2007-05-24 12:58         ` Maciej Sobczak
2007-05-24 13:42           ` Dmitry A. Kazakov
2007-05-24 22:08           ` Robert A Duff
2007-07-01  1:00             ` David Thompson
2007-05-24 22:58           ` Randy Brukardt
2007-05-25  7:52             ` Maciej Sobczak
2007-05-25  8:21               ` Dmitry A. Kazakov
2007-05-25 20:27                 ` Maciej Sobczak
2007-05-26  7:48                   ` Dmitry A. Kazakov [this message]
2007-05-27  8:30                     ` Maciej Sobczak
2007-05-27 10:04                       ` Dmitry A. Kazakov
2007-05-29  8:03                         ` Maciej Sobczak
2007-05-29 13:18                           ` Dmitry A. Kazakov
2007-05-29 13:32                             ` Dmitry A. Kazakov
2007-05-29 15:34                             ` Maciej Sobczak
2007-05-29 17:07                               ` Dmitry A. Kazakov
2007-05-30  7:40                                 ` Maciej Sobczak
2007-05-30  8:43                                   ` Dmitry A. Kazakov
2007-05-30 12:54                                     ` Maciej Sobczak
2007-05-30 13:56                                       ` Dmitry A. Kazakov
2007-05-30 16:49                                         ` vgodunko
2007-05-30 20:52                                         ` Maciej Sobczak
2007-05-31  8:15                                           ` Dmitry A. Kazakov
2007-05-31 13:46                                             ` Maciej Sobczak
2007-06-01  7:29                                               ` Dmitry A. Kazakov
2007-06-01 13:32                                                 ` Maciej Sobczak
2007-06-01 14:53                                                   ` Dmitry A. Kazakov
2007-06-01 20:31                                                     ` Maciej Sobczak
2007-06-02  8:19                                                       ` Dmitry A. Kazakov
2007-06-02 16:49                                                         ` Maciej Sobczak
2007-06-03  7:09                                                           ` Dmitry A. Kazakov
2007-06-03 22:04                                                             ` Maciej Sobczak
2007-06-04  8:08                                                               ` Dmitry A. Kazakov
2007-06-04 17:02                                                                 ` Maciej Sobczak
2007-06-05  8:35                                                                   ` Dmitry A. Kazakov
2007-06-05 22:12                                                                     ` Maciej Sobczak
2007-06-06  8:21                                                                       ` Dmitry A. Kazakov
2007-06-06 14:46                                                                         ` Maciej Sobczak
2007-06-06 15:11                                                                           ` Maciej Sobczak
2007-06-06 15:32                                                                       ` Markus E Leypold
2007-05-24 10:42       ` Georg Bauhaus
2007-05-24 13:41         ` Dmitry A. Kazakov
2007-05-25 16:59         ` Markus E Leypold
2007-05-28  9:52           ` Georg Bauhaus
2007-05-28 11:50             ` Dmitry A. Kazakov
2007-05-28 23:32               ` Georg Bauhaus
2007-05-29 12:05                 ` Dmitry A. Kazakov
2007-05-29 13:33                 ` Georg Bauhaus
2007-05-29 17:29                   ` Dmitry A. Kazakov
2007-05-29 20:46                     ` Georg Bauhaus
2007-05-30  7:53                       ` Dmitry A. Kazakov
2007-05-30 13:18                       ` Georg Bauhaus
2007-05-31 10:27                         ` Dmitry A. Kazakov
2007-05-31 11:44                         ` Georg Bauhaus
2007-06-01  7:37                           ` Dmitry A. Kazakov
2007-06-01 10:07                             ` Markus E Leypold
2007-06-01 11:41                             ` Georg Bauhaus
2007-06-01 13:07                               ` Dmitry A. Kazakov
2007-05-28 13:47             ` Markus E Leypold
2007-05-28 23:12               ` Georg Bauhaus
2007-05-28 13:56             ` Markus E Leypold
2007-05-28 23:00               ` Georg Bauhaus
2007-05-24  7:39 ` Dmitry A. Kazakov
2007-05-24 11:12   ` Stefan Lucks
2007-05-24 13:56     ` Dmitry A. Kazakov
2007-05-24 14:41       ` Stefan Lucks
2007-05-24 15:46         ` Dmitry A. Kazakov
2007-05-24 15:00       ` Georg Bauhaus
replies disabled

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