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.
next prev parent 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