6.7 Submethods

     

A submethod is declared like a method , but behaves more like a sub in that it's not inherited but can be pulled in with a role. Submethods are useful for inheriting interface without inheriting implementation ”you can override a method from a parent class without inflicting the changes on any child classes.

The Frogstar::A class defines a set of methods and attributes for the Frogstar Scout robots:

 class Frogstar::A {     has Laser::Beam     $.beam;     has Antimatter::Ray $.ray;     has Electron::Ram   $.ram;      . . .      method zap   ($target) { $.beam.fire($target); }     method shoot ($target) { $.ray.fire($target);  }     method smash ($target) { $.ram.fire($target);  }      . . .  } 

In addition to methods for navigation, propulsion , etc., the Frogstar Scouts boast an astounding number of destructive methods (as is to be expected). The Frogstar::B class inherits all of Frogstar::A 's methods and attributes, and also adds its own additional weaponry. Instead of defining a new method for the Zenon Emitter, the Frogstar Scout B overrides the smash method to use the emitter:

 class Frogstar::B is Frogstar::A {     has Zenon::Emitter $.emitter;     submethod smash ($target) { $.emitter.fire($target); } } 

It still smashes the target, only faster, as you might expect from a newer model. Since the overridden method was declared as a submethod, it has no effect on the Frogstar Scout C, which inherits from Frogstar::B :

 class Frogstar::C is Frogstar::B { . . . }  . . .  $fighter = Frogstar::C.new( . . . ); $fighter.smash($floor); # uses the Electron::Ram 



Perl 6 and Parrot Essentials
Perl 6 and Parrot Essentials, Second Edition
ISBN: 059600737X
EAN: 2147483647
Year: 2003
Pages: 116

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net