Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine

Re: •Re: RFC: Class::DispatchToAll

by TheDamian (Priest)
on Jul 11, 2002 at 04:23 UTC ( #180937=note: print w/replies, xml ) Need Help??

in reply to •Re: RFC: Class::DispatchToAll
in thread RFC: Class::DispatchToAll

The problem this solves is very real-world. Consider a Perl class hierarchy in which a class Child inherits from classes Mother and Father:
package Child; use base qw(Mother Father);
If both Mother and Father have DESTROY methods, what happens? Under normal Perl semantics, only Mother::DESTROY would be called, since it's the left-most, depth-first method encountered during the dispatch. But failing to call one (or more) of an object's inherited destructors is not correct behaviour. Hence the need to be able to call all of them:
package Child; use base qw(Mother Father); sub DESTROY { $_[0]->EVERY::DESTROY }

Replies are listed 'Best First'.
Re: Re: •Re: RFC: Class::DispatchToAll
by dws (Chancellor) on Jul 11, 2002 at 06:03 UTC
    The problem this solves is very real-world. Consider a Perl class hierarchy in which a class Child inherits from classes Mother and Father:

    Uh, oh. Multiple Inheritance.

    A couple of years of doing Smalltalk (which didn't have multiple inheritance, but which let you fake interface interitance via mixins), and a couple of years of Java and C++ have lead me to believe that Multiple Inheritance is a Very Risky Thing, and that it can always be worked around by either composition or reducing to inheriting from one data-bearing class and multiple (data-less) interface classes. Doing so avoids the multiple destructor problem.

    Perhaps you've run into a situation where multiple inheritance is the right thing to do. If so, I'd like to hear about it.

      It happens often in LPC. It's a language mostly used for building MUDs. Often you will have a standard weapon class and a standard wearable class. All weapons inherit from the weapon class, while all wearables inherit from the wearable class. But boxing gloves would inherit from both.

      Some problems LPC has with multiple inheritance aren't found in Perl (for instance, the possibility of duplicating variables when a class is inherited by two paths - different implementations of LPC solve it differently). Other things are solved differently, for instance, one flavour of LPC forbids inheriting from two classes if they have methods with the same name - unless the inheriting class defines a method with that same name.

      There is nothing wrong with multiple inheritance. It's just hard to implement is right, which is way some languages take the easy way out and outright forbid it. Inheritance is already a hard problem in Perl, but multiple inheritance is a real nightmare. But that's the fault of Perl, not of multiple inheritance.


•Re: Re: •Re: RFC: Class::DispatchToAll
by merlyn (Sage) on Jul 11, 2002 at 15:22 UTC
    OK, that problem is solved by NEXT, and discipline. It's the responsibility when you want to extend, rather than override, to call your parent method. Particularly with DESTROY.

    So I still haven't seen a place where calling all of the methods blindly is useful or maintainable.

    -- Randal L. Schwartz, Perl hacker

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://180937]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others romping around the Monastery: (4)
As of 2017-09-24 19:36 GMT
Find Nodes?
    Voting Booth?
    During the recent solar eclipse, I:

    Results (274 votes). Check out past polls.