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}; }
In reply to Re: inheritance: constructors
by dws
in thread inheritance: constructors
by Basilides
For: | Use: | ||
& | & | ||
< | < | ||
> | > | ||
[ | [ | ||
] | ] |