comp.lang.ada
 help / color / mirror / Atom feed
* Constructing an object
@ 2005-09-21  8:46 Maciej Sobczak
  2005-09-21 10:16 ` Georg Bauhaus
                   ` (2 more replies)
  0 siblings, 3 replies; 34+ messages in thread
From: Maciej Sobczak @ 2005-09-21  8:46 UTC (permalink / raw)


Hi,

I'm learning Ada and I would like to better understand the ways used to 
create objects.

Let's say I have the following:

    type Color is (Black, Red, Green, Blue, White);

    type Shape is tagged record
       C : Color;
    end record;

    type Rectangle is new Shape with record
       A, B : Positive;
    end record;


 From what I've learnt ("Ada 95: The Craft of Object-Oriented 
Programming" by John English), there are two possible ways to implement 
"constructors" for these types:

1. By procedure, which is a primitive operation for each type in the 
hierarchy, for example:

    procedure New_Shape(C : in Color; S : out Shape) is
    begin
       S.C := C;
    end;

    procedure New_Rectangle(A, B : in Positive; C : in Color; R : out 
Rectangle) is
    begin
       New_Shape(C, Shape(R));
       R.A := A;
       R.B := B;
    end;

    -- another version (btw - which version do you prefer?)
    procedure New_Rectangle(A, B : in Positive; C : in Color; R : out 
Rectangle) is
       St : Shape;
    begin
       New_Shape(C, St);
       R := (St with A => A, B => B);
    end;


This does not please me much, because I can have uninitialized objects, 
which may not make sense in the program:

    R : Rectangle;

2. By function:

    function New_Shape(C : in Color) return Shape is
       S : Shape;
    begin
       S.C := C;
       return S;
    end;

    function New_Rectangle(A, B : in Positive; C : in Color) return 
Rectangle is
       R : Rectangle;
    begin
       Shape(R) := New_Shape(C);   -- is this OK?
       R.A := A;
       R.B := B;
       return R;
    end;

This does not please me for the same reason - no enforcement of proper 
initialization, if a given type makes no sense uninitialized.


What approach do you actually use in the real (non-tutorial) code?
Are there other techniques?
(I'm aware of the controlled types, but I need to provide parameters for 
construction, which the special Initialize procedure does not have.)


-- 
Maciej Sobczak : http://www.msobczak.com/
Programming    : http://www.msobczak.com/prog/



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

end of thread, other threads:[~2006-01-17  6:28 UTC | newest]

Thread overview: 34+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-09-21  8:46 Constructing an object Maciej Sobczak
2005-09-21 10:16 ` Georg Bauhaus
2005-09-22  7:21   ` Maciej Sobczak
2005-09-21 11:55 ` Dmitry A. Kazakov
2005-09-22  7:28   ` Maciej Sobczak
2005-09-22  7:45     ` Maciej Sobczak
2005-09-22 13:33       ` Dmitry A. Kazakov
2005-09-24  5:23         ` Randy Brukardt
2005-09-24  9:47           ` Dmitry A. Kazakov
2005-09-29  0:12             ` Randy Brukardt
2005-09-29  8:17               ` Dmitry A. Kazakov
2005-09-29 22:21                 ` Randy Brukardt
2005-09-30  8:14                   ` Jean-Pierre Rosen
2005-09-30 19:28                     ` Dmitry A. Kazakov
2005-09-30 17:49                   ` Robert A Duff
2005-10-01  0:44                     ` Randy Brukardt
2005-10-01 10:49                       ` Dmitry A. Kazakov
2005-10-01 11:06                       ` Tapio Kelloniemi
2005-10-01 14:13                         ` Robert A Duff
2005-10-02 11:52                           ` Tapio Kelloniemi
2005-10-01 15:19                       ` Georg Bauhaus
2005-09-23  5:40 ` Matthew Heaney
2005-09-23  7:18   ` tmoran
2005-09-23  8:23   ` Maciej Sobczak
2005-09-23 12:04     ` Dmitry A. Kazakov
2005-09-23 12:36       ` Matthew Heaney
2005-09-23 13:03         ` Hyman Rosen
2005-09-23 13:41           ` Maciej Sobczak
2005-09-23 14:23           ` Matthew Heaney
2006-01-17  6:28             ` [Offtopic] " James Dennett
2005-09-23 13:42         ` Dmitry A. Kazakov
2005-09-23 14:27           ` Matthew Heaney
2005-09-23 12:24     ` Matthew Heaney
2005-09-24  5:34       ` Randy Brukardt

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