Herencia con Moose
Uso de herencia en Programación Orientada a Objetos con Perl Moose (perl 5).1) Herencia simple (INHERITANCE)
#This is perl 5, version 14, subversion 2 (v5.14.2)#File: Person.pm
package Person; #Super-Class: Es la super-clase
use Moose;
use strict; #Obliga a la programación segura y definición de variables
use warnings; #Ayudará a encontrar errores de sintaxis
use namespace::autoclean;
has 'name' => (
is => 'rw',
isa => 'Str',
reader => 'getName',
writer => 'setName',
);
no Moose;
__PACKAGE__->meta->make_immutable; #no voy a cambiar mi clase
1;
#File: Developer.pm
package Developer;
use Moose;
use strict; #Obliga a la programación segura y definición de variables
use warnings; #Ayudará a encontrar errores de sintaxis
use namespace::autoclean;
extends 'Person'; #SUBCLASSING, hereda de Person
has 'skill' => (
is => 'rw',
isa => 'Str',
reader => 'getSkill',
writer => 'setSkill',
);
no Moose;
__PACKAGE__->meta->make_immutable; #no voy a cambiar mi clase
1;
#.............................................................................................................................
#File: script_subclassing.pl
#!/usr/bin/perl
use strict;
use warnings;
use Moose;
use Developer; #Nuestra clase
my $instancia = Developer->new(name=>'Daro',skill=>'Perl developer');
print "Nombre: " . $instancia->getName() . "\n"; #return 'Daro'
print "Skill: " . $instancia->getSkill() . "\n"; #return 'Perl developer'
#..........................................................................................................................end
2) Herencia Múltiple (multiple inheritance)
#File: WriterMonkey.pm
package WriterMonkey;
use Moose;
use strict;
use warnings;
use namespace::autoclean;
has 'keyBySeconds' => (
is => 'rw',
isa => 'Int',
reader => 'getKeyBySeconds',
writer => 'setKeyBySeconds',
);
sub writerCode {
my ( $self ) = @_;
print "Coding... \n";
}
no Moose;
__PACKAGE__->meta->make_immutable;
1;
#File: Developer.pm
package Developer;
use Moose;
use strict; #Obliga a la programación segura y definición de variables
use warnings; #Ayudará a encontrar errores de sintaxis
use namespace::autoclean;
extends 'Person', 'WriterMonkey'; #multiple inheritance
has 'skill' => (
is => 'rw',
isa => 'Str',
reader => 'getSkill',
writer => 'setSkill',
);
no Moose;
__PACKAGE__->meta->make_immutable;
1;
#.........................................................................................................
#File: script_multiple_inheritance.pl
#!/usr/bin/perl
use strict;
use warnings;
use Moose;
use Developer; #Nuestra clase
my $instancia = Developer->new(name=>'Daro',skill=>'Perl developer', keyBySeconds=>60);
print "Nombre: " . $instancia->getName() . "\n"; #return 'Daro'
print "Skill: " . $instancia->getSkill() . "\n"; #return 'Perl developer'
$instancia->writerCode(); #print 'Coding...'
#..........................................................................................................................end
3) Clases Abstractas o Interfaces con métodos abstractos
Hay que tener en cuenta que ni Perl ni Moose ofrecen clases abstractas. Con Moose se puede definir una clase "interfaz única" con role (Moose::Role), que contiene solo una lista de los métodos requeridos (requires). Cualquier clase que consuma este role debe implementar todos los métodos necesarios, ya sea directamente o a través de la herencia. No se puede retrasar la implementación de los métodos requeridos para que puedan ser implementadas por subclases futuras.
#File: Printable.pm
package Printable; #Clase Interface/Abstracta
use strict;
use warnings;
use Moose::Role;
requires 'doPrint', 'doPrint2'; #Métodos abstractos
#requires must be implemented by a subclass or consumer class
no Moose;
1;
#File: Paper.pm
package Paper;
use Moose;
with 'Printable'; #Implement la clase Printable
has 'text' => (
isa => 'Str', #Tipo String
reader => 'getText',
writer => 'setText'
);
sub doPrint {
my ( $self ) = @_;
print "Doing 1 ... " . $self->getText() . " \n";
};
sub doPrint2 {
my ( $self ) = @_;
print "Doing 2 ... " . $self->getText() . " \n";
};
no Moose;
1;
#File: script_test_interface.pl
#!/usr/bin/perl
use strict;
use warnings;
use Moose;
use Paper; #Nuestra clase que implementa la interface Printable
my $instancia = Paper->new(text=>'texto a immprimir.');
$instancia->doPrint();
$instancia->doPrint2();
-Blog: Getting Started with Moose.
-Moose::Manual::Classes.
-Roles_Versus_Abstract_Base_Classes.
-Moose Manual.