comp.lang.ada
 help / color / mirror / Atom feed
From: ake.ragnar.dahlgren@gmail.com
Subject: Re: Access type to member procedure of instance (Object Oriented programming in Ada)
Date: Mon, 19 Nov 2012 12:52:17 -0800 (PST)
Date: 2012-11-19T12:52:17-08:00	[thread overview]
Message-ID: <6e3f6f2d-d221-4795-9c01-9abb013442b7@googlegroups.com> (raw)
In-Reply-To: <9b0bcb37-8ae3-440f-af4f-a796702e4250@googlegroups.com>

On Monday, November 19, 2012 10:59:42 AM UTC+1, ake.ragna...@gmail.com wrote:
> Not sure if this has already been discussed but: Is it possible to define a pointer to a member procedure of an instance?
> 
> 
> 
> This problem has it's origin in the implementation of the MVC pattern for a GtkAda application. Consider the following:
> 
> 
> 
> package Some_Package is
> 
> 
> 
>    type Message_Type is tagged null record;
> 
>    
> 
>    procedure Print(Message : Message_Type);
> 
> 
> 
> end Some_Package;
> 
> 
> 
> 
> 
> 
> 
> package body Some_Package is
> 
> 
> 
>    procedure Print (Message : Message_Type) is
> 
>    begin
> 
>       null;
> 
>    end Print;
> 
> 
> 
> end Some_Package;
> 
> 
> 
> 
> 
> Then it is possible to create the following Main application that compiles just fine:
> 
> 
> 
> with Some_Package;
> 
> 
> 
> procedure Main is
> 
>    Message : Some_Package.Message_Type;
> 
> begin
> 
>    Message.Print;
> 
> end Main;
> 
> 
> 
> Is it possible to create a parameterless access type to the Message.Print procedure? The following application refuses to compile:
> 
> 
> 
> with Some_Package;
> 
> 
> 
> procedure Main is
> 
>    Message : Some_Package.Message_Type;
> 
>    
> 
>    Method_Ref : access procedure := Message.Print'Access;
> 
> begin
> 
>    Method_Ref;
> 
> end Main;
> 
> 
> 
> The error message is: no selector "Print" for type "Message_Type" defined at some_package.ads:3
> 
> 
> 
> 
> 
> It is possible to create a workaround:
> 
> 
> 
> with Some_Package;
> 
> 
> 
> procedure Main is
> 
>    Message : Some_Package.Message_Type;
> 
>    
> 
>    procedure Method_Ref is
> 
>    begin
> 
>       Message.Print;
> 
>    end Method_Ref;
> 
>    
> 
> begin
> 
>    Method_Ref;
> 
> end Main;
> 
> 
> 
> Is there a better way? Or is this the optimal way?
> 
> 
> 
> Regards,
> 
> Åke Ragnar Dahlgren

Actually I've been thinking. The workaround worked for the contrived example above but not for my Gtkada application.

What inspired the Gtkada application I've been experimenting with is the explanation given by Ada in Denmark on their wiki:

http://wiki.ada-dk.org/building_gui_with_glade_3

What one can see there is that a Builder instance is created and when the application quits it is deallocated. This makes the code suitable for using Ada's object oriented features and to let the Builder instance be created in the Initialize procedure and let it be deallocated in the Finalize procedure.

Also it is possible to see that the callbacks are declared in the Simple_Callbacks package. Note that the methods are not instance member methods.

I hope I am wrong but it seems to me that since Ada lacks the ability to create pointers (maybe access types are the right words) to instance member methods, it is not possible to take advantage of Ada's OOP features when developing Glade3 applications.

Best regards,
Åke Ragnar Dahlgren



  parent reply	other threads:[~2012-11-19 20:52 UTC|newest]

Thread overview: 47+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-11-19  9:59 Access type to member procedure of instance (Object Oriented programming in Ada) ake.ragnar.dahlgren
2012-11-19 11:13 ` Georg Bauhaus
2012-11-19 11:39 ` Brian Drummond
2012-11-20 11:43   ` Brian Drummond
2012-11-20 21:57     ` Randy Brukardt
2012-11-19 13:03 ` sbelmont700
2012-11-19 16:18 ` Adam Beneschan
2012-11-19 17:02   ` Peter C. Chapin
2012-11-19 18:23     ` Adam Beneschan
2012-11-19 20:57       ` Peter C. Chapin
2012-11-19 21:26       ` Dmitry A. Kazakov
2012-11-19 22:19         ` Adam Beneschan
2012-11-20 10:12           ` Dmitry A. Kazakov
2012-11-20 21:51             ` Randy Brukardt
2012-11-21  8:24               ` Dmitry A. Kazakov
2012-11-21 22:19                 ` Randy Brukardt
2012-11-20 10:59     ` Brian Drummond
2012-11-19 20:22 ` ake.ragnar.dahlgren
2012-11-20 11:16   ` Brian Drummond
2012-11-19 20:52 ` ake.ragnar.dahlgren [this message]
2012-11-19 21:56   ` Dmitry A. Kazakov
2012-11-22  9:49     ` ake.ragnar.dahlgren
2012-11-19 22:13   ` sbelmont700
2012-11-19 23:59 ` Randy Brukardt
2012-11-20  0:05   ` Randy Brukardt
2012-11-20  1:00     ` Adam Beneschan
2012-11-20 21:38       ` Randy Brukardt
2012-11-20 23:43         ` Adam Beneschan
2012-11-21 22:12           ` Randy Brukardt
2012-11-22  1:59             ` Adam Beneschan
2012-11-29  2:43               ` Randy Brukardt
2012-11-20  0:52   ` Adam Beneschan
2012-11-20 21:34     ` Randy Brukardt
2012-11-20 11:28   ` Brian Drummond
2012-11-20 14:27     ` Georg Bauhaus
2012-11-20 15:52     ` Adam Beneschan
2012-11-22  9:47 ` ake.ragnar.dahlgren
2012-11-22 10:25   ` Dmitry A. Kazakov
2012-12-02 20:42     ` ake.ragnar.dahlgren
2012-12-03 11:21       ` Dmitry A. Kazakov
2012-12-03 20:21         ` ake.ragnar.dahlgren
2012-12-03 22:15           ` Dmitry A. Kazakov
2012-12-25 21:51           ` Gustaf Thorslund
2012-12-26 18:11             ` ake.ragnar.dahlgren
2012-11-22 12:13   ` Brian Drummond
2012-12-03 16:17     ` ake.ragnar.dahlgren
2012-12-03 21:56       ` Brian Drummond
replies disabled

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