Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number
 
PerlMonks  

Polymorphism?

by Cheburashka (Acolyte)
on Jul 09, 2000 at 21:05 UTC ( [id://21708]=perlquestion: print w/replies, xml ) Need Help??

Cheburashka has asked for the wisdom of the Perl Monks concerning the following question:

I'm writing a module and I kinda wanted to give users a nice package which contains funcs like...printheader (which would prnt a default header) and printheader("index ")...which would print the index header...

Can I achieve polymorhism without the OO interaface? I think splinky or autark mentioned countting params in the @_ ...maybe u mean $_ ? how can you do that?

Edit Masem 2001-11-15 - Removed code tags for readibility.

Replies are listed 'Best First'.
Re: Polymorphism?
by plaid (Chaplain) on Jul 10, 2000 at 00:26 UTC
    Both autark's and crazyinsomniac's answers are what you're looking for, but just to clarify your question a bit, the term you're looking for isn't polymorphism.

    Polymorphism generally refers to the ability to call the correct method on an object depending on its class. It also provides the ability to override methods in derived classes, and still be sure you're getting the one you want.

    The term you're looking for is function overloading, which allows for functions of the same name in the same namespace to co-exist, provided they each have different prototypes. This can be achieved as mentioned above, by looking at @_ and if/elsif/else your way through it, or loop, or whatever you want.

    What you -can't- do in perl is something like this:

    sub blah($) { print "blah\n" } sub blah($$) { print "blah\n" }
    This generates:
    Prototype mismatch: sub main::blah ($) vs ($$) at test.pl line 3.
    on perl 5.005_03 (someone correct me if the behavior is any different in 5.6).

    So, in a sense, you can accomplish what you want to in perl, but not the way you can in other languages such as C++. What you're doing in perl doesn't fit the definition of function overloading, since it's actually calling the same function every time, instead of choosing a function to call based on parameters.

        Wow! Inheritance-friendly overloading for Perl...

        Thanks for the tip, merlyn! :-)

        Russ

        P.S. CPAN seems to complain about inexact case. Try Multimethods for a temporary shortcut.

RE: Polymorphism?
by autark (Friar) on Jul 09, 2000 at 21:16 UTC
    I think you need to check you arguments inside the func()
    sub printheader { my $page = shift; if($page eq "index") { return printheader_index() } elsif($page eq "some other page") { return printheader_some_other_pager() } # ... }
    Autark
(crazyinsomniac) Re: Polymorphism?
by crazyinsomniac (Prior) on Jul 09, 2000 at 23:07 UTC
    Hi,

    Polymorphism???

    Anyway,
    what splinky or someone was talking about is the way to pass parameters to sub's in perl.
    Within a subroutine the array @_ contains the parameters passed to that subroutine.

    ---------------- #!/usr/bin/perl -w &foo; # the function call to foo with no parameters &foo(1); &foo("How's about a piZza?!"); &foo("JAPH"); sub foo { if(@_) { my $varYouPassed=$_[0]; print "You passed the var $varYouPassed to foo."; } else { print "You passed no vars to foo" } } ---------------
    update: um, thanks, fixed it
      I think you meant  my $varYouPassed=$_[0]; not my $varYouPassed=$_0;

      Remember to use <CODE> arround your code, and not <PRE>.

      Paris Sinclair    |    4a75737420416e6f74686572
      pariss@efn.org    |    205065726c204861636b6572
      I wear my Geek Code on my finger.
      

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://21708]
Approved by root
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others scrutinizing the Monastery: (12)
As of 2024-04-23 14:55 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found