Beefy Boxes and Bandwidth Generously Provided by pair Networks
good chemistry is complicated,
and a little bit messy -LW
 
PerlMonks  

Re: inheritance: constructors

by dws (Chancellor)
on Jun 24, 2002 at 22:26 UTC ( [id://176969]=note: print w/replies, xml ) Need Help??


in reply to inheritance: constructors

Inheritance in Perl is indeed clunkier to set up than in other languages. Is it worth it? That depends on what you're doing.

On to the particulars of your example:

In Noun::new(), you need to either defer blessing or re-bless after you've invoked SUPER::new(). Unless you do, Noun::new will return instances of Word. Not correct: see the post below.

A cleaner way is to separate "initialization" from creation.

package Word; sub new { my $pkg = shift; my $self = bless {}, $pkg; $self->initialize(@_); $self; } sub initialize { my $self = shift; $self->{stem} = shift; $self->{english} = shift; } package Noun; use base qw(Word); sub new { my $pkg = shift; bless {}, $pkg; $self->initialize(@_); $self; } sub initialize { my $self = shift; $self->SUPER::initialize(shift, shift); $self->{gender} = shift; $self->{nom_sg} = shift; $self->{gen_sg} = shift; }
This cleans things up, at the expense, arguably, of more "clunk". Then we have to add a bit more clunk to deal with print $w->{english}; which commits the great OO sin of assuming private details of an object. The official way out of this is to add an "accessor" method to your base class.
sub english { my $self = shift; return $self->{english}; }

Replies are listed 'Best First'.
Re: Re: inheritance: constructors
by rjray (Chaplain) on Jun 25, 2002 at 10:05 UTC
    In Noun::new(), you need to either defer blessing or re-bless after you've invoked SUPER::new(). Unless you do, Noun::new will return instances of Word.

    This is not correct. The original author correctly designed the parent-class new constructor to bless based on the class it was called from-- in the case of the example above, Word::new will in fact bless the new object into the Noun class, because that is the value of $classname at that point.

    --rjray

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (5)
As of 2024-04-24 11:16 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found