sábado, 4 de enero de 2014

Programacion Orientada a Objetos con Perl parte 2

Continuamos con los tutoriales de OOP de Perl,en esta ocasión vamos a tocar otro tema importante de la OOP,la herencia.

En perl la herencia se puede hacer igual que en los otros lenguajes de programación,perl maneja las clases como paquetes y para que estos hereden de otros paquetes tienes que estar relacionados entre si,las clases padre se guardan en la variable isa de UNIVERSAL,UNIVERSAL es de donde heredan todas las clases de Perl implícitamente.

Para que una clase herede de otra debemos añadirla al array ISA,pero no es necesario en estos tiempos,lo que haremos sera facilitarnos el trabajo con parent:

En perl existen muchas pero muchas formas de hacer lo mismo ya que incluso lleva el lema There's more than one way to do it,voy a intentar hacerlo de la manera mas simple posible.

Vamos a usar de ejemplo una mascota virtual,(también lo veremos en Java),creamos un archivo llamado Mascota.pm:

vim Mascota.pm

Ahora vamos a crear la clase como vimos en el tutorial pasado.

1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package Mascota;

use feature 'say';

sub new 
{
    my $class = shift;
    my $self = { 
        'Hambre' => 1, 
    };
    bless $self,$class;
    return $self;
}

sub tienesHambre 
{
    my $self = shift;
    if (int($self->{Hambre}) == 1) 
    {
        say "Tengo hambre";
    } 
    else 
    {
        say "No tengo hambre";    
    }
}
sub darDeComer
{
    my $self = shift;
    $self->{Hambre} = 0;
}
1;


Como ven añadí dos funciones una por si tiene hambre y otra para quitarle el hambre(sobra explicarlo).

Ahora vamos a crear un Perro que herede esas funciones de la clase Mascota,creamos un archivo Perro.pm:

vim Perro.pm

Primero definimos el paquete:

package Perro; # Suponiendo que esta en el mismo directorio

Luego usamos Mascota como clase padre:

use parent 'Mascota';

Eso nos ahorra mucho trabajo,ya que verifica las cosas mas importantes como añadir ha isa,verificar autoherencia,etc.

Eso es todo para que un archivo heredara de otro las funciones.

Ahora lo mas importante,el constructor de la clase Perro,para que la clase Perro herede las funciones y las variables de Mascota tenemos que inicializar el constructor de Mascota,para eso creamos una clase new para perro y definimos que el self sea el self de mascota usando la palabra SUPER:


1
2
3
4
5
sub new {
    my $class = shift;
    my $self = $class->SUPER::new();
    return $self;
}

De esa manera ya estan construidos las dos clases,asi queda la clase Perro añadiendo una funcion propia de los perros:


1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
package Perro;
use feature 'say';
use parent 'Mascota';

sub new {
    my $class = shift;
    my $self = $class->SUPER::new();
    return $self;
}

sub ladra {
    say 'woww';
}
1;


Ahora en el principal podemos llamar a la clase Perro y usar las funciones de mascota y de perro:


1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#!/usr/bin/env perl

use strict;
use warnings;

use Perro;

my $perro = Perro->new(); # Creamos un Perro

$perro->tienesHambre(); # Le preguntamos si tiene hambre

$perro->darDeComer(); # Le damos de comer

$perro->tienesHambre(); # Le preguntamos de nuevo

$perro->ladra(); # Y ladra

Eso prueba la herencia de un archivo,veamos la herencia en otro,para eso vamos a crear la clase Gato,toda la clase sera igual solo con sus funciones únicas de un Gato:


1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
package Gato;
use feature 'say';
use parent 'Mascota';

sub new 
{
    my $class = shift;
    my $self = $class->SUPER::new();
    return $self;
}

sub maulla 
{
    say 'miau';
}
1;


Ahora en el programa principal podemos hacer esto:


1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/env perl

use feature 'say';
use Perro;
use Gato;

my $perro = Perro->new();

$perro->tienesHambre();

$perro->darDeComer();

$perro->tienesHambre();

$perro->ladra();

my $gato = Gato->new();

$gato->maulla();

$gato->tienesHambre();



Como ven el Gato hereda las funciones y variables de Mascota,al igual que el Perro.  Tambien podemos poner todo en un mismo archivo.

Como dije en Perl se pueden hacer las cosas de muchas formas esto es un ejemplo de otra forma de herencia en Perl:

Enlace 

Mas informacion :  perldoc.perl.org

No hay comentarios.:

Publicar un comentario

Los comentarios serán revisados antes de ser publicados.