lunes, 9 de septiembre de 2013

La Herencia en Perl


La Herencia es en cierto modo una subclase que hereda las cualidades de una clase, por ejemplo, anteriormente creamos una clase llamada Coche, a partir de esta clase, podemos crear una subclase que herede las propiedades de la clase Coche y de paso añadirle nuevas propiedades y métodos.



 Para el ejemplo que se va a hacer en este post es conveniente ver Perl Orientado a Objetos para crear la clase "Coche".

Supongamos que queremos crear una clase para indicar el precio de un coche y que para ello necesitemos saber el color, velocidad y número de puertas del vehículo, en lugar de construir una nueva clase desde cero con todas estas propiedades, como ya tenemos una clase llamada Coche, únicamente la importamos a una nueva subclase.

Para realizar la herencia se utiliza un Array llamado "@ISA", que puede contener tantas herencias como se necesiten, si sólo hereda una clase se le llama herencia simple y si hay más de una herencia es llamado herencia múltiple.

En el siguiente ejemplo crearemos una nueva subclase llamada "PrecioCoche" que heredará la clase "Coche", el valor del coche será determinado según la velocidad máxima que pueda alcanzar ...

PrecioCoche.pm


package PrecioCoche;
#Agregamos la herencia a la nueva subclase PrecioCoche
use Coche;
@ISA = qw(Coche);

use strict;

#Creamos el constructor
sub new
{
my $this=shift; #Cogemos la clase que somos o una referencia a la clase (si soy un objeto)
my $class = ref($this) || $this; #Averiguo la clase a la que pertenezco
     my $self=$class->Coche::new("Coche"); #Inicializamos las propiedades con las usadas en Coche
     $self->{PRECIO} = undef; #No se indica ningun precio
     bless $self, $class; #Se crea la clase
     return ($self); #Devolvemos la clase recién construida
}

sub precio
{
    my $self=shift; #El primer parámetro de un metodo es la  clase

 #Determinamos el precio segun la velocidad del coche
    if ($self->{VELOCIDAD_MAXIMA} <= 160)
    {
    $self->{PRECIO} = 6000;
    }
    elsif ($self->{VELOCIDAD_MAXIMA} > 160 && $self->{VELOCIDAD_MAXIMA} <= 220)
    {
    $self->{PRECIO} = 12000;
    }
    elsif ($self->{VELOCIDAD_MAXIMA} > 220)
    {
    $self->{PRECIO} = 18000;
    }
    else
    {
    $self->{PRECIO} = "Ha ocurrido un error \n"; 
    }
    
       #Devolvemos el precio
       return $self->{PRECIO};
}
#Muy importante
#Fin del modulo
1;


Ahora hacemos uso de la nueva subclase, crea un archivo llamado "precio.pl" ...

precio.pl

use PrecioCoche;

my $coche=PrecioCoche::new("PrecioCoche");
#para inicializar la clase tambien se puede hacer de la siguiente forma
#my $coche=PrecioCoche->new();

$color = $coche->color("Verde");
$ruedas = $coche->ruedas;
$velocidad_maxima = $coche->velocidad_maxima(280);
$puertas = $coche->puertas(3);
$precio = $coche->precio;

print "Caracteristicas del coche ... \n";
print "Color: $color \n";
print "Ruedas: $ruedas \n";
print "Velocidad maxima: $velocidad_maxima k/h \n";
print "Puertas: $puertas \n";
print "Precio: $precio \n";


Tutorial de iniciación a Perl en Español

Creo que los ejemplos son sencillos de comprender y pueden servir de base para crear clases y subclases más avanzadas.