domingo, 28 de septiembre de 2014

Perl: POO con Moose, Herencia

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();



Referencias:
-Blog: Getting Started with Moose.
-Moose::Manual::Classes.
-Roles_Versus_Abstract_Base_Classes.
-Moose Manual.



No hay comentarios:

Publicar un comentario