comp.lang.ada
 help / color / mirror / Atom feed
* Factory Pattern
@ 2007-07-25 18:19 shaunpatterson
  2007-07-25 18:28 ` Martin
                   ` (3 more replies)
  0 siblings, 4 replies; 26+ messages in thread
From: shaunpatterson @ 2007-07-25 18:19 UTC (permalink / raw)


I'm just starting out learning Ada and I'm having some trouble
converting some C++ code.

The last hurtle I'm having trouble with is implementing a Factory in
Ada

I basically have a base class Message and all other messages are
derived from this.
I have a function call createMessage that I would like to return the
appropriate
subclass type.


My code looks something like this:

type Message is abstract tagged;
type Message_Class is access all Message'Class;

derived type:

package MessageInteger_Pkg is

-- I want this to act like a constructor
-- Just fills in the value
function create (i : Integer) return MessageInteger;

private
type MessageInteger with new Message with
record
      value : Integer;
end record;


end MessageInteger_Pkg;

-- create looks like this:
function create (i : Integer) return MessageInteger is
     msg : MessageInteger;
begin
     msg.value := i;
     return msg;
end create;




Factory method:

-- I would like it to work like this...
function createMessage (type : Integer) return Message_Class is
begin
         case type is
                 when 0 =>
                      return MessageInteger_Pkg.create (1234);
                 when others =>
                       return MessageSomethingElse_Pkg.create
("blah");
         end case

end createMessage


However - it doesn't like me returning the MessageInteger from a
class
that returns a Message_Class (obviously..)

Now if I do this -- changing the constructor to take in a
Message_Class....


function createMessage (type : Integer) return Message_Class is
      decodedMessage : Message_Class;
begin
         case type is
                 when 0 =>
                      decodedMessage := new
MessageInteger_Pkg.MessageInteger;
                       MessageInteger_Pkg.create (decodedMessage,
1234);        -- change the decoded message this way
                       return decodedMessage;
                 when others =>
                       return MessageSomethingElse_Pkg.create
("blah");
         end case

end createMessage


-- That method works... but I find the intermediary step of making a
new object decodedMessage
to someone unneeded?  There must be another way of doing this.
Perhaps I should move the "new"
to the create function?

And... I'm not completely sure I'm doing all this correctly in Ada.
LIke I said,  I'm very new to
Ada.

Thanks

--
Shaun




^ permalink raw reply	[flat|nested] 26+ messages in thread

end of thread, other threads:[~2007-08-26  7:18 UTC | newest]

Thread overview: 26+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-07-25 18:19 Factory Pattern shaunpatterson
2007-07-25 18:28 ` Martin
2007-07-25 18:51 ` Dmitry A. Kazakov
2007-07-25 21:06   ` Georg Bauhaus
2007-07-25 19:27 ` Matthew Heaney
2007-07-26  0:51 ` Jeffrey R. Carter
2007-07-26  6:44   ` Maciej Sobczak
2007-07-26  8:40     ` Georg Bauhaus
2007-07-26  9:53       ` Dmitry A. Kazakov
2007-07-26 11:01         ` Georg Bauhaus
2007-07-26 13:02           ` Maciej Sobczak
2007-07-26 13:44             ` Dmitry A. Kazakov
2007-07-26 14:58             ` Georg Bauhaus
2007-07-26 22:31             ` Randy Brukardt
2007-07-27 13:07               ` Maciej Sobczak
2007-07-27 14:23                 ` shaunpatterson
2007-07-27 22:23                 ` Randy Brukardt
2007-07-28 18:56                   ` Maciej Sobczak
2007-07-29  7:54                   ` Maciej Sobczak
2007-07-29  8:53                     ` Dmitry A. Kazakov
2007-07-29 10:53                     ` Georg Bauhaus
2007-07-26 16:58         ` Adam Beneschan
2007-07-29 11:38         ` Manuel Gomez
2007-07-27 10:16     ` Jeffrey R. Carter
2007-07-27 12:47       ` Maciej Sobczak
2007-08-26  7:18         ` David Thompson

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