in reply to inheritance: constructors
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.
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.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; }
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 |