Account Options

  1. Sign in
The old Google Groups will be going away soon, but your browser is incompatible with the new version.
Google Groups Home
« Groups Home
Message from discussion Roles and Mix-ins?
The group you are posting to is a Usenet group. Messages posted to this group will make your email address visible to anyone on the Internet.
Your reply message has not been sent.
Your post was successful
 
From:
To:
Cc:
Followup To:
Add Cc | Add Followup-to | Edit Subject
Subject:
Validation:
For verification purposes please type the characters you see in the picture below or the numbers you hear by clicking the accessibility icon. Listen and type the numbers you hear
 
Luke Palmer  
View profile  
 More options Jan 6 2004, 9:49 pm
Newsgroups: perl.perl6.language
From: fibon...@babylonia.flatirons.org (Luke Palmer)
Date: Tue, 6 Jan 2004 19:34:02 -0700
Local: Tues, Jan 6 2004 9:34 pm
Subject: Re: Roles and Mix-ins?

Joe Gottman writes:

> ----- Original Message -----
> From: "Luke Palmer" <fibon...@babylonia.flatirons.org>
> To: <perl6-langu...@perl.org>
> Sent: Tuesday, January 06, 2004 4:51 AM
> Subject: [perl] Re: Roles and Mix-ins?

> > David Storrs writes:

> > > On Sat, Dec 13, 2003 at 11:12:31AM -0800, Larry Wall wrote:
> > > > On Sat, Dec 13, 2003 at 04:57:17AM -0700, Luke Palmer wrote:

> > > > : For one, one role's methods don't silently override another's.
> Instead,
> > > > : you get, er, role conflict and you have to disambiguate yourself.

> > > How do you disambiguate?

> > Let's see...

> >     role Dog {
> >         method bark() { print "Ruff!" }
> >     }
> >     role Tree {
> >         method bark() { print "Rough!" }
> >     }
> >     class Trog
> >       does Dog does Tree {
> >         method bark() { .Dog::bark() }
> >       }
> >     }

> > Perhaps something like that.  In any case, you do it by putting the
> > offending method directly in the aggregating class.

>    How about something like
>         class Trog
>        does Dog {bark=>dogBark} does Tree {bark=>treeBark}
>        {...}

>     Then we could have code like
>       my Trog $foo = Trog.new();
>       my Dog $spot :=  $foo;
>       my Tree $willow := $foo;
>       $spot.bark(); # calls dogBark()
>       $willow.bark(); #calls treeBark()

>    This works better when Dog::bark and Tree::bark are both needed but they
> do different things.

Renaming methods defeats the purpose of roles.  Roles are like
interfaces inside-out.  They guarantee a set of methods -- an interface
-- except they provide the implementation to (in terms of other,
required methods).  Renaming the method destroys the interface
compatibility.

Your renaming can be done easily enough, and more clearly (IMO) with:

    class Trog
      does Dog does Tree {
        method bark() { ... }   # Explicitly remove the provided method
        method dogBark()  { .Dog::bark() }
        method treeBark() { .Tree::bark() }
    }

Luke


 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.