• Publicidad

Sobrecarga de constructores

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Sobrecarga de constructores

Notapor panterozo » 2010-03-17 09:51 @452

Quería saber a través de algún ejemplo, cómo poder sobrecargar un constructor...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. package Consulta;
  2.  
  3. sub new{
  4.     my($class,$dato)=@_;
  5.     my $self = {
  6.            dato=> $dato
  7.      };
  8.     bless $self,$class;
  9.     return $self;
  10. }
  11.  
  12.  
  13. sub new{
  14.     my($class,$referencia_dato)=@_;
  15.     my $self = {
  16.            dato=> $referencia_dato
  17.      };
  18.     bless $self,$class;
  19.     return $self;
  20. }
  21.  
  22. sub operaciones{}...
  23.  
  24. package Main
  25.  
  26. ....
  27. my $variable = new Consulta("hola");
  28. ....
  29. my $variable = new Consulta(\@un_arreglo);
  30. ...
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


¿Cómo el constructor de la clase Consulta sabrá a cuál entrar...? ¿O en Perl se debe realizar algún truco (como ya he visto muchos :P) ?

Muchas gracias ;)
panterozo
Perlero nuevo
Perlero nuevo
 
Mensajes: 160
Registrado: 2010-01-26 08:36 @400

Publicidad

Re: Sobrecarga de constructores

Notapor panterozo » 2010-03-17 10:52 @494

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. package Consulta;
  2.  
  3. sub new{
  4.     my($class,$dato,$referencia_dato)=@_;
  5.     my $self = {
  6.            dato=> $dato,
  7.            arreglo=> $referencia_dato
  8.      };
  9.     bless $self,$class;
  10.     return $self;
  11. }
  12.  
  13.  
  14. sub operaciones{}...
  15.  
  16. package Main
  17.  
  18. ....
  19. my $variable = new Consulta("hola");
  20. ...
  21. my $variable = new Consulta(undef,\@un_arreglo);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



Esta es la solución que adopté... poco elegante, pero solución. ¿Alguna otra idea de realizar el código no tan "trucado" o cohesionado?
panterozo
Perlero nuevo
Perlero nuevo
 
Mensajes: 160
Registrado: 2010-01-26 08:36 @400

Re: Sobrecarga de constructores

Notapor explorer » 2010-03-17 13:06 @587

Si la diferencia, entre las distintas llamadas, es -por ejemplo- el número de argumentos, podrías mirar el valor escalar de @_ dentro del método para saber a qué constructor nos referimos.

Algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub new{
    if (2 == @_) {
        my($class,$dato)=@_;
        my $self = {
            dato => $dato,
        };
    }
    elsif (3 == @_) {
        my($class,$referencia_dato) = @_;
        my $self = {
            dato => $referencia_dato,
        };
    }

    bless $self,$class;
    return $self;
}
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


(Sacado de Overloading en perl.com)

Humm... seguro que hay algún módulo Perl que permite hacer esto de forma más elegante.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Sobrecarga de constructores

Notapor kidd » 2010-03-17 19:24 @850

explorer escribiste:Humm... seguro que hay algún módulo Perl que permite hacer esto de forma más elegante.


Sería interesante, yo no conozco un módulo que haga algo parecido.

Por lo menos yo uso la técnica que mostraste, especialmente cuando quiero que una función pueda ser llamada como método de un objeto o simplemente una función externa:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$Object->get_color(); #llamada como método

get_color(); #llamada como función
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Re: Sobrecarga de constructores

Notapor panterozo » 2010-03-18 11:16 @511

La respuesta de Kidd no la entiendo :S.... Si pudieses poner un código más extenso, con las llegadas de las variables a los métodos o funciones, estaría de pelos ;)

A explorer, si fuese de esa forma... ¿hay alguna forma de indicarle a Perl si lo que está entrando sería un varchar, int, algún arreglo, o un hash?

Si lo que entra es un int, y lo comparo con un varchar
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if($dato_entrante == 3){

}elsif($dato_entrante eq "dato entrante"){

}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


en la sentencia elsif, línea 3, me indicaría un error y el programa no se ejecutaría (si mal no recuerdo...)

Me parece buena idea comparar dentro del new(), aunque me intriga saber si Perl puede en definitiva asegurarse de qué tipo de dato ingresa al new() y así poder discriminar.
panterozo
Perlero nuevo
Perlero nuevo
 
Mensajes: 160
Registrado: 2010-01-26 08:36 @400

Re: Sobrecarga de constructores

Notapor explorer » 2010-03-18 14:02 @627

En Perl v5 no existe el concepto de int o varchar (salvo que uses algún módulo específico). Solo hay escalares, arreglos y diccionarios.

Pero con Moose sí que puedes delimitar el tipo de los argumentos.

La forma de saber si un escalar, que almacena una referencia, es un de tipo o de otro, es por medio de la función ref().

En el ejemplo que pones, sería interesante que hicieras una prueba por ti mismo, para ver si funciona o no.

Actualización: new() no es una palabra reservada del Perl, así que puedes llamar a tus constructores como quieras. E incluso tener varios, con tal de que tengan nombres distintos.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Sobrecarga de constructores

Notapor explorer » 2010-03-19 10:18 @470

En la documentación Perl tienes, a través de perldoc, los siguientes documentos:

* perlobj Objetos, en Perl
* perlboot Manual de programación Perl orientada a objetos, para principiantes
* perltoot Manual de programación Perl orientada a objetos, parte 1
* perltooc Manual de programación Perl orientada a objetos, parte 2
* perlbot Trucos y ejemplos de la programación Perl orientada a objetos

Hoy en día, lo más moderno en programación orientada a objetos, en Perl, es el módulo Moose (y Mouse).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Sobrecarga de constructores

Notapor panterozo » 2010-03-22 16:29 @728

Siempre son bienvenidos tus comentarios sobre los modulos de CPAN explorer... les echaré una mirada

muchas gracias
panterozo
Perlero nuevo
Perlero nuevo
 
Mensajes: 160
Registrado: 2010-01-26 08:36 @400


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 13 invitados

cron