comp.lang.ada
 help / color / mirror / Atom feed
From: Georg Bauhaus <rm.dash-bauhaus@futureapps.de>
Subject: Re: Access to function returning class-wide type
Date: Thu, 21 Aug 2008 14:01:38 +0200
Date: 2008-08-21T14:01:38+02:00	[thread overview]
Message-ID: <48ad5922$0$20706$9b4e6d93@newsspool4.arcor-online.net> (raw)
In-Reply-To: <g8jf3n$e00$1@registered.motzarella.org>

Paweł 'Nivertius' Płazieński schrieb:

> package B is 
>         type Derived is new A.Abstracted with null record;
>         function Proc (N : Natural) return Derived;
> 
>         Failing_Object : A.The_Access_Type := B.Proc'Access;
>         --  will not compile, error: 'expected type The_Access_Type / found type
> access function Proc defined at ...'

(Compiler is right because the profile of B.Proc is different
from that of The_Access_Type (whose functions return Abstracted'Class,
not Derived)

In general, public access types lead to unneccessary complication;
tagged types are by reference already, so you could simply use
dispatching and a factory instead. Do you have spefific needs
for pointers to functions returning by-reference objects?

Or follow Dmitry's advice.


   package A is
      type Abstracted is abstract tagged null record;
      function Proc (N : Natural) return Abstracted is abstract;

      package Constructor is
         No_Suitable_Type: exception;

         function Proc_Wrapper(N : Natural) return Abstracted'Class;
         -- create objects of types in Abstracted'Class; the
         -- specific type depends on N and other things that are
         -- in scope in Constructor's body
      end Constructor;

   end A;

   with A;
   package B is
      type Derived is new A.Abstracted with null record;
      overriding
      function Proc (N : Natural) return Derived;
   end B;



   package body A is
      package body Constructor is

         function Proc_Wrapper(N : Natural) return Abstracted'Class is
         begin
            if N > 666 then  -- and possibly Some_Other_Condition ...
               declare
                  use B;
               begin
                  return Derived'(Proc(N));
               end;
            else
               --
               -- other cases TBD
               --
               raise No_Suitable_Type;
            end if;
         end Proc_Wrapper;

      end Constructor;
   end A;

   package body B is
      function Proc (N : Natural) return Derived is
      begin
         return Derived'(null record);
      end Proc;
   end B;


HTH
--
Georg Bauhaus
Y A Time Drain  http://www.9toX.de



  parent reply	other threads:[~2008-08-21 12:01 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 [this message]
2008-08-21 13:01   ` Paweł 'Nivertius' Płazieński
2008-08-21 13:50     ` Dmitry A. Kazakov
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