comp.lang.ada
 help / color / mirror / Atom feed
From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: Access to function returning class-wide type
Date: Thu, 21 Aug 2008 15:50:04 +0200
Date: 2008-08-21T15:50:07+02:00	[thread overview]
Message-ID: <9bmxv7t985ke$.p14upop2x80z.dlg@40tude.net> (raw)
In-Reply-To: g8joue$kc6$1@registered.motzarella.org

On Thu, 21 Aug 2008 15:01:01 +0200, Pawe� 'Nivertius' P�azie�ski wrote:

> First of all, the problem with that is, that I couldn't define conditions
> and types for them dynamicaly.
> Second (of all?), each new Derived type in child, or even remotely other
> package needs to be hard-coded into examples package A.
> 
> I have a map between condition on an object of some type (in example it
> was 'N') and access-to-function which creates the object derived from
> Abstracted. I've also got funcion which gets the 'object of some type' and
> for each key in the map checks if the condition is true. If so,
> calls 'constructor' passing that 'object of some type' and returns its
> result. If no condition is true, the function raises an exception.
> (I probably should wrote that in original post).

So you could replace it with a map condition->type tag and then proceed
with Ada.Tags.Generic_Dispatching_Constructor, because the map
tag->constructor is for free, here you do not need pointers any more, in
Ada 2005. The compiler will force to override the "constructor" for each
concrete derived type.

-------------
Having said that, there still is a difficult problem with construction of
the map. I don't know if it is an issue for you, but it is for the
persistency layer I designed. The problem is that if the map is open-ended,
you need some mechanism of registration of each new type in the map. This
is still unresolved in Ada. The pattern I am using is that each package
declaring a new type is required to call some class-wide procedure
registering the type upon package elaboration. In your case it is the
condition associated with the type tag. That cannot be enforced, and it
works only at the library level, i.e. for "immortal" types.

A possible solution in the future language revisions could be to introduce
type constructors/destructors: user-defined procedures called upon
derivation and leaving the scope of a type.

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



  reply	other threads:[~2008-08-21 13:50 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-08-21 10:13 Access to function returning class-wide type Paweł 'Nivertius' Płazieński
2008-08-21 10:33 ` Paweł 'Nivertius' Płazieński
2008-08-21 11:02 ` Dmitry A. Kazakov
2008-08-21 11:56   ` Paweł 'Nivertius' Płazieński
2008-08-21 13:34     ` Dmitry A. Kazakov
2008-08-22  4:53       ` Randy Brukardt
2008-08-22 23:50         ` Randy Brukardt
2008-08-21 12:01 ` Georg Bauhaus
2008-08-21 13:01   ` Paweł 'Nivertius' Płazieński
2008-08-21 13:50     ` Dmitry A. Kazakov [this message]
2008-08-21 19:30       ` Paweł 'Nivertius' Płazieński
2008-08-21 20:56         ` Dmitry A. Kazakov
2008-08-22  7:34           ` Paweł 'Nivertius' Płazieński
2008-08-21 17:02 ` Adam Beneschan
2008-08-21 19:22   ` Paweł 'Nivertius' Płazieński
replies disabled

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