caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* [Caml-list] Is there a compact syntax for masking methods in an inherit
@ 2003-09-06 22:26 Ryan R Newton
  2003-09-07  8:03 ` Jacques Garrigue
  0 siblings, 1 reply; 3+ messages in thread
From: Ryan R Newton @ 2003-09-06 22:26 UTC (permalink / raw)
  To: caml-list

Hello Camlers,

I've developed a liking for using multiple inheritacnce heavily as
follows:

When I'm working on a library (say, an evolutionary computation library,
or a distributed computing library), I'm real crazy about making
composable "plug-and-play" units of functionality rather than a
monolithic class hierarchy.  That is, I like to make a base class along
with small virtual "layer" classes.  I combine different features by
defining a new class which inherits from the base class and a subset of
the layer classes.

Is there a name for this sort of pattern?  Is it a horrible idea for
some reason?


Anyway, the point of this post is:  When inheriting the same method from
two sources, I quite reasonably get this message:

"Warning: the following methods are overriden by the inherited class:"

What's the best way to get rid of it?  (Without turning off all
warnings.)

Here's an example:

   class a =
   object (self)
     method f = 3
     method g = self#f * 3
   end

   class virtual b =
   object (self)
     method g = self#f * 4
   end

   class c =
   object
     inherit a
     inherit b  
     method h = 99
   end  

   Warning: the following methods are overriden by the inherited class: 
      g

Ideally, I'd like to make the overlap explicit and get rid of the
warning at the same time by typing something like:

      inherit a without g

Any ideas? 


--Ryan Newton




-------------------
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] 3+ messages in thread

* Re: [Caml-list] Is there a compact syntax for masking methods in an inherit
  2003-09-06 22:26 [Caml-list] Is there a compact syntax for masking methods in an inherit Ryan R Newton
@ 2003-09-07  8:03 ` Jacques Garrigue
       [not found]   ` <1063148703.27949.43.camel@moremischief>
  0 siblings, 1 reply; 3+ messages in thread
From: Jacques Garrigue @ 2003-09-07  8:03 UTC (permalink / raw)
  To: newton; +Cc: caml-list

From: Ryan R Newton <newton@MIT.EDU>

> I've developed a liking for using multiple inheritacnce heavily as
> follows:
> 
> When I'm working on a library (say, an evolutionary computation library,
> or a distributed computing library), I'm real crazy about making
> composable "plug-and-play" units of functionality rather than a
> monolithic class hierarchy.  That is, I like to make a base class along
> with small virtual "layer" classes.  I combine different features by
> defining a new class which inherits from the base class and a subset of
> the layer classes.
> 
> Is there a name for this sort of pattern?  Is it a horrible idea for
> some reason?

It looks like what most people call a mixin.
Or is it different?

> Anyway, the point of this post is:  When inheriting the same method from
> two sources, I quite reasonably get this message:
> 
> "Warning: the following methods are overriden by the inherited class:"
> 
> What's the best way to get rid of it?  (Without turning off all
> warnings.)

If you just mean, turn off only this warning, this is easy

   ocamlc -w m

Clearly what you are doing is legal and reasonable, but I see no way
to avoid the warning for public methods without disabling it.

For private methods, you can hide them when inheriting, but then you
are changing the semantics (the methods will not be merged)

  class c = object
    inherit (a : object method f : int end)
    inherit b
    ...
  end
is legal if g is private in a.

The impossibility to hide public methods is fundamental to the ocaml
type system. So "inherit g without a" is impossible.

A possibility would be to disable the warning when a virtual method is
declared after inheritance.

>    class c =
>    object
>      inherit a
       method virtual g : int
>      inherit b  
>      method h = 99
>    end

This seems reasonable to have no warning in this case, the intention
being explicit enough.
Of course, if there is no definition of g in b, the definition from a
would be kept (we don't change the semantics, just the warning).

Would this avoid your problem?
Other solutions would imply new syntax, for something that is no more
than a warning.

      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] 3+ messages in thread

* Re: [Caml-list] Is there a compact syntax for masking methods in an inherit
       [not found]   ` <1063148703.27949.43.camel@moremischief>
@ 2003-09-10  1:06     ` Jacques Garrigue
  0 siblings, 0 replies; 3+ messages in thread
From: Jacques Garrigue @ 2003-09-10  1:06 UTC (permalink / raw)
  To: newton, caml-list

From: "Ryan R. Newton" <newton@MIT.EDU>
> 
> > >    class c =
> > >    object
> > >      inherit a
> >        method virtual g : int
> > >      inherit b  
> > >      method h = 99
> > >    end
> 
> > Would this avoid your problem?
> > Other solutions would imply new syntax, for something that is no more
> > than a warning.
> 
> Yes, that would be super cool.  That solution provides exactly what I
> wanted, which was an explicit articulation *in the code* of which
> methods are being overridden, for readabilities' sake.  (So I think I'll
> start doing that regardless of whether it disables the warnings.)

OK, I've commited the change, and the warning is now effectively
disabled in this case. Only the warning behaviour is changed.

This will be in 3.07, except if somebody has a good reason against it.

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] 3+ messages in thread

end of thread, other threads:[~2003-09-10  1:06 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-09-06 22:26 [Caml-list] Is there a compact syntax for masking methods in an inherit Ryan R Newton
2003-09-07  8:03 ` Jacques Garrigue
     [not found]   ` <1063148703.27949.43.camel@moremischief>
2003-09-10  1:06     ` Jacques Garrigue

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).