caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* Re: [Caml-list] Protected methods
  2002-07-19 10:01       ` Alessandro Baretta
@ 2000-07-20  0:46         ` Jacques Garrigue
  2002-07-20  7:41           ` Alessandro Baretta
  2002-07-20  1:31         ` Jacques Garrigue
  1 sibling, 1 reply; 16+ messages in thread
From: Jacques Garrigue @ 2000-07-20  0:46 UTC (permalink / raw)
  To: alex; +Cc: caml-list

From: Alessandro Baretta <alex@baretta.com>
> > Actually, this seems perfectly practical.
> > If you have some good reason to "protect" a method, you can do it
> > cleanly.
> 
> I would not call adding a fake type a clean solution. It's 
> not idiomatic. A "protected" keyword is cleaner and easier 
> to handle. Although it might be very tricky to implement in 
> a language with type inference.

Actually, this is just an alternative model for protection:
give all your clients the key, and don't give it to other people.
This makes sense. The key can be a dummy only because the type system
guarantees that you cannot forge its type.
The problem with a "protected" keyword is that it should be given a
semantics. Since an object type is structural (does not belong to a
specific module), this is unclear how you can define where a protected
method should be accessible.

In practice, I probably won't do it that way, but this would require a
deeper knowledge of your problem.
For instance, if you want to show an internal state to a limited
number of clients, you can just have a method returning this state
with an abstract type. That's certainly more natural.

> How about the following pseudocode? Is it sensible/viable?
> 
> let module M : sig
>    class type public = object <public_methods> end
>    val make_public : unit -> public
> end = struct
>    class type public = object <public_methods> end
>    class protectd =
>      object (self : #public)
>      <public_methods>
>      <protected_methods>
>    end
>    let make_public () -> (new protected :> public)
> end
> 
> If this a working alternative, I would prefer over both the 
> protector type and the protected keyword: clean, simple, and 
> idiomatic.

This is both sensible and viable.
The only weakness is that you won't be able to inherit from the public
version of your class, since it is not a class but only a type.
If you need to inherit, you should also export the protected version,
and make sure that all your constructors apply a similar coercion to
hide protected methods.

This inheritance problem is the only reason I didn't suggest this
approach first, but it is certainly simpler.

Jacques Garrigue
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


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

* [Caml-list] Protected methods
@ 2002-07-18 10:42 Alessandro Baretta
  2002-07-18 11:01 ` Gerd Stolpmann
  2002-07-20 22:48 ` Dmitry Bely
  0 siblings, 2 replies; 16+ messages in thread
From: Alessandro Baretta @ 2002-07-18 10:42 UTC (permalink / raw)
  To: Ocaml

I'm trying to get the semantics of protected methods of C++. 
I have a class with a method that is not meaningful for the 
outside world, but different instances of this class should 
be able to invoke this method on one another.

I need something like the following pseudocode:

class a =
object
   method protected m = ...
   method m2 (obj:a) = a # m
end

I understand this can be obtained by creating a container 
module for class a and restricting the type of a through the 
module signature. I read the manual but was unable to figure 
out the syntax to do this. Would anyone be so kind as to 
lend a hand?

Thank you very much.

Alex

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


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

* Re: [Caml-list] Protected methods
  2002-07-18 10:42 [Caml-list] Protected methods Alessandro Baretta
@ 2002-07-18 11:01 ` Gerd Stolpmann
  2002-07-18 11:44   ` Alessandro Baretta
  2002-07-20 22:48 ` Dmitry Bely
  1 sibling, 1 reply; 16+ messages in thread
From: Gerd Stolpmann @ 2002-07-18 11:01 UTC (permalink / raw)
  To: Alessandro Baretta; +Cc: Ocaml

Alessandro Baretta wrote:
> I'm trying to get the semantics of protected methods of C++. I have a 
> class with a method that is not meaningful for the outside world, but 
> different instances of this class should be able to invoke this method 
> on one another.
> 
> I need something like the following pseudocode:
> 
> class a =
> object
>   method protected m = ...
>   method m2 (obj:a) = a # m
> end
> 
> I understand this can be obtained by creating a container module for 
> class a and restricting the type of a through the module signature. I 
> read the manual but was unable to figure out the syntax to do this. 
> Would anyone be so kind as to lend a hand?

No, you cannot restrict the type of classes by signatures.
The only way I know to protect a method is to define an opaque
type that is hidden by the signature, e.g.

sample.ml:

type protector = unit

class a =
object
   method m () = ...
   ...
end

sample.mli:

type protector

class a :
object
   method m : protector -> XXX
   ...
end

You cannot call m from other modules because you cannot create values
for the type "protector".

Gerd
-- 
------------------------------------------------------------
Gerd Stolpmann * Viktoriastr. 45 * 64293 Darmstadt * Germany
gerd@gerd-stolpmann.de          http://www.gerd-stolpmann.de
------------------------------------------------------------

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


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

* Re: [Caml-list] Protected methods
  2002-07-18 11:01 ` Gerd Stolpmann
@ 2002-07-18 11:44   ` Alessandro Baretta
  2002-07-19  8:50     ` Jacques Garrigue
  0 siblings, 1 reply; 16+ messages in thread
From: Alessandro Baretta @ 2002-07-18 11:44 UTC (permalink / raw)
  To: Gerd Stolpmann, Ocaml

Gerd Stolpmann wrote:
> No, you cannot restrict the type of classes by signatures.
> The only way I know to protect a method is to define an opaque
> type that is hidden by the signature, e.g.
> 
> sample.ml:
> 
> type protector = unit
> 
> class a =
> object
>   method m () = ...
>   ...
> end
> 
> sample.mli:
> 
> type protector
> 
> class a :
> object
>   method m : protector -> XXX
>   ...
> end
> 
> You cannot call m from other modules because you cannot create values
> for the type "protector".
> 
> Gerd

Effective, definitely, but practical? Is this not supposed 
to be a feature of any general purpose object oriented language?

Anyway, for the meantime I'll keep the method public, and 
make sure I don't use it anywhere except where it makes 
sense, and I'll wait for some more insight from the developers.

Thank you very much, Gerd.

Alex

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


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

* Re: [Caml-list] Protected methods
  2002-07-18 11:44   ` Alessandro Baretta
@ 2002-07-19  8:50     ` Jacques Garrigue
  2002-07-19 10:01       ` Alessandro Baretta
  0 siblings, 1 reply; 16+ messages in thread
From: Jacques Garrigue @ 2002-07-19  8:50 UTC (permalink / raw)
  To: alex; +Cc: caml-list

From: Alessandro Baretta <alex@baretta.com>
> Gerd Stolpmann wrote:
> > No, you cannot restrict the type of classes by signatures.
> > The only way I know to protect a method is to define an opaque
> > type that is hidden by the signature, e.g.
> > 
> > sample.ml:
> > 
> > type protector = unit
> > 
> > class a =
> > object
> >   method m () = ...
> >   ...
> > end
> > 
> > sample.mli:
> > 
> > type protector
> > 
> > class a :
> > object
> >   method m : protector -> XXX
> >   ...
> > end
> > 
> > You cannot call m from other modules because you cannot create values
> > for the type "protector".
> > 
> > Gerd
> 
> Effective, definitely, but practical? Is this not supposed 
> to be a feature of any general purpose object oriented language?

Actually, this seems perfectly practical.
If you have some good reason to "protect" a method, you can do it
cleanly.

By the way, ocaml is not a general purpose object-oriented languages,
but a general purpose functional language with object-oriented
features. In particular, encapsulation is supported by the module
system rather than the class system.
Even in object-oriented languages, I've seen heated discussions on
whether using friend classes was good style or not.

> Anyway, for the meantime I'll keep the method public, and 
> make sure I don't use it anywhere except where it makes 
> sense, and I'll wait for some more insight from the developers.

Note that in many cases there are other ways to obtain the expected
behaviour.
For instance, if only one specific object is supposed to use a method,
you might register a private callback with it rather than the other
way round.

Jacques Garrigue
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


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

* Re: [Caml-list] Protected methods
  2002-07-19  8:50     ` Jacques Garrigue
@ 2002-07-19 10:01       ` Alessandro Baretta
  2000-07-20  0:46         ` Jacques Garrigue
  2002-07-20  1:31         ` Jacques Garrigue
  0 siblings, 2 replies; 16+ messages in thread
From: Alessandro Baretta @ 2002-07-19 10:01 UTC (permalink / raw)
  To: Jacques Garrigue; +Cc: caml-list



Jacques Garrigue wrote:
>>>You cannot call m from other modules because you cannot create values
>>>for the type "protector".
>>>
>>>Gerd
>>
>>Effective, definitely, but practical? Is this not supposed 
>>to be a feature of any general purpose object oriented language?
> 
> 
> Actually, this seems perfectly practical.
> If you have some good reason to "protect" a method, you can do it
> cleanly.

I would not call adding a fake type a clean solution. It's 
not idiomatic. A "protected" keyword is cleaner and easier 
to handle. Although it might be very tricky to implement in 
a language with type inference.

> By the way, ocaml is not a general purpose object-oriented languages,
> but a general purpose functional language with object-oriented
> features. In particular, encapsulation is supported by the module
> system rather than the class system.
> Even in object-oriented languages, I've seen heated discussions on
> whether using friend classes was good style or not.

This is too big an issue for me. I only expressed the need I 
perceive for a construct to enable different instances of 
the same class to call methods on their siblings which are 
not visible to the general public. What I really want is a 
way to restrict through a type coercion the type of my 
"autofriendly" class.

>>Anyway, for the meantime I'll keep the method public, and 
>>make sure I don't use it anywhere except where it makes 
>>sense, and I'll wait for some more insight from the developers.
> 
> 
> Note that in many cases there are other ways to obtain the expected
> behaviour.

How about the following pseudocode? Is it sensible/viable?

let module M : sig
   class type public = object <public_methods> end
   val make_public : unit -> public
end = struct
   class type public = object <public_methods> end
   class protectd =
     object (self : #public)
     <public_methods>
     <protected_methods>
   end
   let make_public () -> (new protected :> public)
end

If this a working alternative, I would prefer over both the 
protector type and the protected keyword: clean, simple, and 
idiomatic.

> For instance, if only one specific object is supposed to use a method,
> you might register a private callback with it rather than the other
> way round.
> 
> Jacques Garrigue

Hrmmm.... uuuhhh.... yes? What's it mean?

Thank you very much, Jacques, for taking time to answer my 
former post.

Alex

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


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

* Re: [Caml-list] Protected methods
  2002-07-19 10:01       ` Alessandro Baretta
  2000-07-20  0:46         ` Jacques Garrigue
@ 2002-07-20  1:31         ` Jacques Garrigue
  2002-07-20  7:48           ` Alessandro Baretta
  1 sibling, 1 reply; 16+ messages in thread
From: Jacques Garrigue @ 2002-07-20  1:31 UTC (permalink / raw)
  To: alex; +Cc: caml-list

From: Alessandro Baretta <alex@baretta.com>

> How about the following pseudocode? Is it sensible/viable?
> 
> let module M : sig
>    class type public = object <public_methods> end
>    val make_public : unit -> public
> end = struct
>    class type public = object <public_methods> end
>    class protectd =
>      object (self : #public)
>      <public_methods>
>      <protected_methods>
>    end
>    let make_public () -> (new protected :> public)
> end

Actually, after a more thorough look at your code, I'm not sure of
what you're trying to achieve with it.  Applied directly, it seems
that it would give you no more than private methods: you can not use
them outside of the class.

And I've found a better idiom, that should do about anything you want.

module M : sig
  type hidden
  class type public = object < public methods >  method full : hidden end
  val make_public : unit -> public
  class virtual protected : object ('a)
    < public methods >
    < protected methods >
    method full : 'a
  end
end = struct
  class protected = object (self)
    < public methods >
    < protected methods >
    method full = self
  end
  type hidden = protected
  class type public = object < public methods >  method full : hidden end
  let make_public () = (new protected : protected :> public)
end

The point is that now you can access the protected methods while
your code appears in the same module, through the full method (which
just returns self, but with its protected methods accessible), but not
from outside the module (hidden is abstract).

Note also how I exported protected as virtual: this way you cannot
create objects from it, but you can still use it through inheritance.
If you don't need to inherit, you don't have to export it though, and
then you don't have to distinguish protected and hidden either.

Here is a concrete instance of that, to verify the type checking:

module M : sig
  type hidden
  class type public = object method pub : int  method full : hidden end
  val make_public : unit -> public
  val call_prot : public -> int
  class virtual protected : object ('a)
    method pub : int
    method prot : int
    method full : 'a
  end
end = struct
  class protected = object (self)
    method prot = 1
    method pub = self#prot
    method full = self
  end
  type hidden = protected
  class type public = object method pub : int  method full : hidden end
  let make_public () = (new protected : protected :> public)
  let call_prot (o : public) = o#full#prot
end

Jacques Garrigue
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


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

* Re: [Caml-list] Protected methods
  2000-07-20  0:46         ` Jacques Garrigue
@ 2002-07-20  7:41           ` Alessandro Baretta
  0 siblings, 0 replies; 16+ messages in thread
From: Alessandro Baretta @ 2002-07-20  7:41 UTC (permalink / raw)
  To: Jacques Garrigue, Ocaml

Jacques Garrigue wrote:
> 
> Actually, this is just an alternative model for protection:
> give all your clients the key, and don't give it to other people.
> This makes sense. The key can be a dummy only because the type system
> guarantees that you cannot forge its type.
> The problem with a "protected" keyword is that it should be given a
> semantics. Since an object type is structural (does not belong to a
> specific module), this is unclear how you can define where a protected
> method should be accessible.

I would be happy enough if protected methods were accessible 
to other instances of the same class. This would be easy to 
implement in O'Caml's type system, because the only place 
where protected methods are visible is between the "object" 
and "end" keywords. Nowhere else would the type system need 
to account for the presence of protected keywords.

class a = object private method m = let x = new a in x # m end

> In practice, I probably won't do it that way, but this would require a
> deeper knowledge of your problem.
> For instance, if you want to show an internal state to a limited
> number of clients, you can just have a method returning this state
> with an abstract type. That's certainly more natural.

I fully agree. But what do you do when an instance of class 
a holds other instances of class a which must collaborate 
with the first in order to achieve the functionality of the 
first? One possibility would be have define two classes: a 
front-end, with only the methods which should be generally 
available, and a backend, inheriting from the first and 
adding those methods that are only meaningful for the 
front-end. Otherwise, you define only one class and add a 
protected keyword for these latter methods.

>>How about the following pseudocode? Is it sensible/viable?
>>
>>let module M : sig
>>   class type public = object <public_methods> end
>>   val make_public : unit -> public
>>end = struct
>>   class type public = object <public_methods> end
>>   class protectd =
>>     object (self : #public)
>>     <public_methods>
>>     <protected_methods>
>>   end
>>   let make_public () -> (new protected :> public)
>>end
>>
>>If this a working alternative, I would prefer over both the 
>>protector type and the protected keyword: clean, simple, and 
>>idiomatic.
> 
> 
> This is both sensible and viable.
> The only weakness is that you won't be able to inherit from the public
> version of your class, since it is not a class but only a type.
> If you need to inherit, you should also export the protected version,
> and make sure that all your constructors apply a similar coercion to
> hide protected methods.

This is really all I need. At present, I do not perceive any 
problem with inheritance, but then again, I might in the 
future. At any rate, this is how I plan to modify the code I 
am presently working on, so as to guarantee that the methods 
I do not wish my object to export be kept private.

> This inheritance problem is the only reason I didn't suggest this
> approach first, but it is certainly simpler.
> 
> Jacques Garrigue

Thank you very much for you interesting comments. I hope 
that discussing such issues as this on the list might help 
the Caml team improve its compiler and language.

Alex Baretta

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


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

* Re: [Caml-list] Protected methods
  2002-07-20  1:31         ` Jacques Garrigue
@ 2002-07-20  7:48           ` Alessandro Baretta
  0 siblings, 0 replies; 16+ messages in thread
From: Alessandro Baretta @ 2002-07-20  7:48 UTC (permalink / raw)
  To: Jacques Garrigue, ocaml



Jacques Garrigue wrote:
> From: Alessandro Baretta <alex@baretta.com>
> 
>>How about the following pseudocode? Is it sensible/viable?
>>
>>let module M : sig
>>   class type public = object <public_methods> end
>>   val make_public : unit -> public
>>end = struct
>>   class type public = object <public_methods> end
>>   class protectd =
>>     object (self : #public)
>>     <public_methods>
>>     <protected_methods>
>>   end
>>   let make_public () -> (new protected :> public)
>>end
> 
> 
> Actually, after a more thorough look at your code, I'm not sure of
> what you're trying to achieve with it.  Applied directly, it seems
> that it would give you no more than private methods: you can not use
> them outside of the class.

Allowing different instances of a class to invoke protected 
methods on each other, without these methods being exported 
to the general public.

> And I've found a better idiom, that should do about anything you want.

Success! :-)

> module M : sig
>   type hidden
>   class type public = object < public methods >  method full : hidden end
>   val make_public : unit -> public
>   class virtual protected : object ('a)
>     < public methods >
>     < protected methods >
>     method full : 'a
>   end
> end = struct
>   class protected = object (self)
>     < public methods >
>     < protected methods >
>     method full = self
>   end
>   type hidden = protected
>   class type public = object < public methods >  method full : hidden end
>   let make_public () = (new protected : protected :> public)
> end

I publicly bow to another Jedi camler. May inheritance and 
subtyping be with you.

Alex

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


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

* Re: [Caml-list] Protected methods
  2002-07-18 10:42 [Caml-list] Protected methods Alessandro Baretta
  2002-07-18 11:01 ` Gerd Stolpmann
@ 2002-07-20 22:48 ` Dmitry Bely
  2002-07-20 23:08   ` Brian Smith
  2002-07-20 23:54   ` Alessandro Baretta
  1 sibling, 2 replies; 16+ messages in thread
From: Dmitry Bely @ 2002-07-20 22:48 UTC (permalink / raw)
  To: caml-list

Alessandro Baretta <alex@baretta.com> writes:

> I'm trying to get the semantics of protected methods of C++. I have a
> class with a method that is not meaningful for the outside world, but
> different instances of this class should be able to invoke this method
> on one another.
>
> I need something like the following pseudocode:
>
> class a =
> object
>    method protected m = ...
>    method m2 (obj:a) = a # m
> end

Do not private Ocaml methods have in fact "protected" C++ semantics? They
cannot be called directly but can be used in methods of inherited
classes...

- Dmitry Bely


-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


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

* Re: [Caml-list] Protected methods
  2002-07-20 22:48 ` Dmitry Bely
@ 2002-07-20 23:08   ` Brian Smith
  2002-07-22  3:37     ` OCaml's OO design " Jacques Garrigue
  2002-07-20 23:54   ` Alessandro Baretta
  1 sibling, 1 reply; 16+ messages in thread
From: Brian Smith @ 2002-07-20 23:08 UTC (permalink / raw)
  To: caml-list

Dmitry Bely wrote:
 > Do not private Ocaml methods have in fact "protected" C++ semantics?
 > They cannot be called directly but can be used in methods of inherited
 > classes...

This was my impression as well. I think it would be a good idea to add
something to the FAQ about how UML-ish/Java-ish
private/protected/public/package visibility maps to O'Caml. And, if
there isn't a direct mapping in some cases, then perhaps explanations of
"workarounds" like the ones presented in this thread.

Thanks,
Brian



-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


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

* Re: [Caml-list] Protected methods
  2002-07-20 22:48 ` Dmitry Bely
  2002-07-20 23:08   ` Brian Smith
@ 2002-07-20 23:54   ` Alessandro Baretta
  2002-07-21  7:52     ` Dmitry Bely
  1 sibling, 1 reply; 16+ messages in thread
From: Alessandro Baretta @ 2002-07-20 23:54 UTC (permalink / raw)
  To: Dmitry Bely, Ocaml


Dmitry Bely wrote:
> Do not private Ocaml methods have in fact "protected" C++ semantics? They
> cannot be called directly but can be used in methods of inherited
> classes...
> 
> - Dmitry Bely

I thought so, too. I made several atttempts, and the 
compiler seemed to reject all of them. Let me see if I can 
cook up a quick example.

# class a = object method private m : unit = (new a) # m end;;
The expression "new a" has type a = <  > but is used with type
   < m : unit; .. >
Only the second object type has a method m

Alex

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


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

* Re: [Caml-list] Protected methods
  2002-07-20 23:54   ` Alessandro Baretta
@ 2002-07-21  7:52     ` Dmitry Bely
  2002-07-21 13:14       ` Alessandro Baretta
  0 siblings, 1 reply; 16+ messages in thread
From: Dmitry Bely @ 2002-07-21  7:52 UTC (permalink / raw)
  To: caml-list

Alessandro Baretta <alex@baretta.com> writes:

>> Do not private Ocaml methods have in fact "protected" C++ semantics? They
>> cannot be called directly but can be used in methods of inherited
>> classes...
>> - Dmitry Bely
>
> I thought so, too. I made several atttempts, and the compiler seemed
> to reject all of them. Let me see if I can cook up a quick example.
>
> # class a = object method private m : unit = (new a) # m end;;
> The expression "new a" has type a = <  > but is used with type
>    < m : unit; .. >
> Only the second object type has a method m

That's because Ocaml private methods can only be applied to the "self" or
"super" object, not to other class instances. Obviously, an object
hierarchy has nothing to do with a class hierarchy (C++'s "private" and
"protected" just ignore existence of the first one, and IMHO that is not
good). But why do you need to call other instance's private/protected
methods? Maybe you should slightly change your design? Could you roughly
describe your task?

- Dmitry Bely


-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


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

* Re: [Caml-list] Protected methods
  2002-07-21  7:52     ` Dmitry Bely
@ 2002-07-21 13:14       ` Alessandro Baretta
  0 siblings, 0 replies; 16+ messages in thread
From: Alessandro Baretta @ 2002-07-21 13:14 UTC (permalink / raw)
  To: caml-list



Dmitry Bely wrote:
> Alessandro Baretta <alex@baretta.com> writes:
> 
> But why do you need to call other instance's private/protected
> methods? Maybe you should slightly change your design? Could you roughly
> describe your task?
> 
> - Dmitry Bely

Yes. I have a class whose instances are responsible for 
formatting specific XML trees. Each instance is responsible 
for generating a text box which is decomposed in a header, a 
body, and a footer. While a given object handles directly 
the body of a text box, it delegates the header and the 
footer to two other instances of the same class, in a 
"has-a" relation with the former. This decomposition can be 
done recursively, thereby yielding an object tree or 
hierarchy. There are methods that are only meaningful when 
called by the body object on the header and footer objects. 
Client classes of this text box class are not supposed to 
invoke those methods that are used for data exchange between 
two objects associated by the above "has-a" relation.

Alex

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


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

* OCaml's OO design Re: [Caml-list] Protected methods
  2002-07-20 23:08   ` Brian Smith
@ 2002-07-22  3:37     ` Jacques Garrigue
  2002-07-22  4:20       ` John Prevost
  0 siblings, 1 reply; 16+ messages in thread
From: Jacques Garrigue @ 2002-07-22  3:37 UTC (permalink / raw)
  To: brian-l-smith; +Cc: caml-list

From: Brian Smith <brian-l-smith@uiowa.edu>
> Dmitry Bely wrote:
>  > Do not private Ocaml methods have in fact "protected" C++ semantics?
>  > They cannot be called directly but can be used in methods of inherited
>  > classes...
> 
> This was my impression as well. I think it would be a good idea to add
> something to the FAQ about how UML-ish/Java-ish
> private/protected/public/package visibility maps to O'Caml. And, if
> there isn't a direct mapping in some cases, then perhaps explanations of
> "workarounds" like the ones presented in this thread.

That would be certainly useful.
Unfortunately, my understanding of these issues is only partial, as
for most developpers of ocaml: they are much better at type theory of
O.O. than the quirks of each O.O. language.

OK, let's try:
Java                            OCaml
private                         private + hidden by interface
protected/subclasses only       private
default=package protected       public + type abstraction
protected                       public + type abstraction + export class
public                          public

Hidden by interface means defining a class type with some private
methods omitted.
Type abstraction means the workaround I presented earlier in this
thread, combining subtyping to hide methods, and use of an abstract
type to access hidden methods. You can choose to export or not the
class, to allow subclassing outside of the module.
However, if you want to enforce package protection for individual
methods while exporting the class, you have to abstract the type of
the method itself (Gerd Stolpmann's trick is not enough to avoid
redefinition):
        type hidden = ...
        method m : m_hidden

Why is ocaml's typing so different from other typed OO languages?
Essentially, this is because it chose a radically different
theoretical fundation, with structural rather than by-name typing.
This means that unrelated classes may have the same class type!
I believe this choice comes from another, more primitive choice, of
building object-polymoprhism on parametric polymorphism rather than
subtyping.

This provides for a very powerful language (at least in theory), where
you can type safely more OO programs and idioms than in any other
"usable" language.  But this also means some rough edges, as the basis
is rather experimental.

By the way, my experience with ocaml makes me think that the current
design is at least wrong on one point: mixing classes and class types.
As written above, two unrelated classes may have the same class type,
so there is no point in creating a class type for each class (it is
not "owned" by the class).
And a bad consequence of this choice is all these "unbound type
variable" errors, which are just due to the need to define a class
type.
By separating the two, and making classes first-class, one could clean
up some things, and for instance allow defining a class anywhere in an
expression (you would want to do a bit of lambda-lifting for
efficiency).

On the other hand, I also understand why it was designed that way:
abbreviating types is essential to get understandable error messages,
and this would have to be done explicitely, which some might find
verbose.
Yet, I wonder whether the separation would be a worthwhile (extensive)
change.

Cheers,

Jacques Garrigue
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


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

* Re: OCaml's OO design Re: [Caml-list] Protected methods
  2002-07-22  3:37     ` OCaml's OO design " Jacques Garrigue
@ 2002-07-22  4:20       ` John Prevost
  0 siblings, 0 replies; 16+ messages in thread
From: John Prevost @ 2002-07-22  4:20 UTC (permalink / raw)
  To: caml-list

Just as a note, I think the major barrier to the "friend" behavior of
"protected" and "private" in Java (that is, methods of the appropriate
classes are able to call a given method even though other pieces of
code cannot see that it exists) is that subtyping and subclassing are
independent.

In Java, if you are handed a value of a given type and know that type
is a subclass of the "Foo" class, you *know* that it has all the
methods (hidden and not hidden) that a Foo has.  In O'Caml, this
luxury is not available.  If the object type of foo does not indicate
that a method "bar" exists, it may very well not exist.

This is why you need to do a song and dance with abstract types to
achieve the same effect.  The method *must* be visible or other
objects can't call it, since it is *only* the type of an object that
defines its interface.  Using type abstraction means that only code
that knows the underlying type has access, which allows you to show
that the method is there and has the right type, while not allowing
access to everybody.

Does this feel clunky?  Yes, a little bit.  But it's a price I'm
willing to pay for structural subtyping and self types.  I think it
calls to mind some of the subtler problems with subclassing and
subtyping--like invariants.  If you call a "protected" method in Java,
it generally means you're depending on the subclass to maintain
invariants from the superclass.  But all too often, this can lead to
problems where modularity breaks down.

Bondage programming?  Yeah, could be.  :) But it has some interesting
typing properties rarely found elsewhere, and makes us think about a
different set of implications in object calculi than most languages.
Consider learning to work within these constraints to be working in a
different programming paradigm than Java or C++ provides--because it
clearly is.  Different idioms are needed.  Some possibilities that
were closed off become open, and some that were open are now more
constrained.

It's, quite honestly, a load of fun.

John.
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


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

end of thread, other threads:[~2002-07-22  4:13 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-07-18 10:42 [Caml-list] Protected methods Alessandro Baretta
2002-07-18 11:01 ` Gerd Stolpmann
2002-07-18 11:44   ` Alessandro Baretta
2002-07-19  8:50     ` Jacques Garrigue
2002-07-19 10:01       ` Alessandro Baretta
2000-07-20  0:46         ` Jacques Garrigue
2002-07-20  7:41           ` Alessandro Baretta
2002-07-20  1:31         ` Jacques Garrigue
2002-07-20  7:48           ` Alessandro Baretta
2002-07-20 22:48 ` Dmitry Bely
2002-07-20 23:08   ` Brian Smith
2002-07-22  3:37     ` OCaml's OO design " Jacques Garrigue
2002-07-22  4:20       ` John Prevost
2002-07-20 23:54   ` Alessandro Baretta
2002-07-21  7:52     ` Dmitry Bely
2002-07-21 13:14       ` Alessandro Baretta

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).