comp.lang.ada
 help / color / mirror / Atom feed
From: Felix Krause <flyx@isobeef.org>
Subject: Re: OOP in Ada: Alternatives for "protected" scope
Date: Fri, 4 May 2012 20:48:53 +0200
Date: 2012-05-04T20:48:53+02:00	[thread overview]
Message-ID: <jo18al$f4m$1@online.de> (raw)
In-Reply-To: 1vn9nv4aqm9a3.1tqzc91idjlbs$.dlg@40tude.net

On 2012-05-03 21:56:51 +0000, Dmitry A. Kazakov said:
> 
> If Do_Something varies in children they should override it. The reusable
> parts common for all children can be factored out as a private class-wide
> operation.

Compared to my version (with redispatching issues fixed), this 
alternative enforces a weaker contract. It does not enforce the child 
classes to call Do_Prologue and Do_Epilogue when implementing 
Do_Something. While this fixes the problem that I cannot have an 
abstract method in the private part, I think the mix-in solution you 
suggested in your second post is a better way to handle this.

> All children having access to private operations must be declared in
> children packages.
> 
>    package P is
>       type A is abstract tagged private;
>       procedure Do_Something (Object : in out A) is abstract;
>    private
>       ...
>       procedure Do_Prologue  (Object : in out A'Class);
>       procedure Do_Epilogue  (Object : in out A'Class);
>    end P;
> 
>    package P.Q is
>       type B is new A with private;
>       overriding procedure Do_Something (Object : in out B);
>       ...
>    end P.Q;
> 
>    package body P.Q is
>       procedure Do_Something (Object : in out B) is
>       begin
>           Do_Prologue (Object);
>           ... -- Do specific calculations
>           Do_Epilogue (Object);
>       end Do_Something;
>    end P.Q;
> 
>> In languages like Java and C#, there is a "protected" scope to cope
>> with this situation.
> 
> This is exactly what Ada's private is. The correspondence goes as follows:
> 
> "Public" <-> Ada' public operation
> "Protected" <-> Ada's private operation
> "Private" <-> An operation defined in the package body

So, to be able to use these visibility scopes, the class hierarchy must 
follow the layout of the package hierarchy. I think this is a 
disadvantage for some reasons:

 * Given the scenario that you use an Ada software library containing 
tagged types, you have to subclass these types in child-packages within 
the package layout of the library. I for myself would rather want to 
place my code in the package hierarchy of my application.

 * It doesn't work with generics:

generic
   -- ...
package P is
   type A is tagged private;
   -- …
end P;

package Q is
   package P_Instance is new P (...);

   type B is new P_Instance.A with private;
end P.Q.R;

Any non-generic tagged type derived from an instance of a generic 
parent type cannot access that type's "protected" methods - as all 
child packages of a generic package also must be generic.




  reply	other threads:[~2012-05-04 18:48 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-05-03 21:27 OOP in Ada: Alternatives for "protected" scope Felix Krause
2012-05-03 21:56 ` Dmitry A. Kazakov
2012-05-04 18:48   ` Felix Krause [this message]
2012-05-04 22:00     ` Dmitry A. Kazakov
2012-05-05  8:28       ` Felix Krause
2012-05-05 11:53         ` Dmitry A. Kazakov
2012-05-05  4:33     ` Shark8
2012-05-03 23:34 ` Randy Brukardt
2012-05-04  1:41 ` BrianG
2012-05-04 10:37 ` Georg Bauhaus
2012-05-04 10:43   ` Georg Bauhaus
2012-05-04 12:10   ` Dmitry A. Kazakov
replies disabled

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