Nathan Wiger <[EMAIL PROTECTED]> writes:
> Piers Cawley wrote:
> >
> > Eeeewwwwww. Most of the time I use 'my Dog $spot' is along the lines
> > of:
> >
> > my Dog $spot = Dog::Dalmation->new(name => 'Spot');
> > $spot->bark;
>
> No problem, that still works, according to the RFC...
It does? Note that, whilst @Dog::Dalmation::ISA may well contain the
string 'Dog', it's highly unlikely that
my Dog $spot;
Would know that I actually want a new Dalmation.
Also, you've managed to miss the more important case where I want to
use a factory method:
my Dog $patches = $dog_pound->get_cute_stray;
Where all I know is that the factory method is going to return a Dog
of some sort.
Or what about:
print "What sort of dog do you want? ";
my $dog_type = ucfirst(<STDIN>); chomp $dog_type;
my Dog $puppy = "Dog::${dog_type}"->new(name => $dog_name);
In *none* of these cases can you guarantee that 'ref $foo' will be
'Dog', but you are instead asserting that '$foo->isa("Dog")'.
>
> > sub bark {
> > my Dog $self = shift;
> > print $self->name, " barks!\n";
> > }
>
> Here I guess I miss the point of the Dog inside the bark() sub? It seems
> unnecessary to me. Maybe a better example of what you're trying to get
> at?
Because, hopefully, there are efficiency gains to be had when perl
*knows* that $self is a Dog. If it only makes the 'name' method call
work faster then it's a good result. Admittedly 'bark' is a fairly
simple function method with only one other method call, but in more
complex methods one would expect efficiency gains.
> > There's a whole host of occasions when you want 'my Dog $spot' but you
> > *don't* want $spot to be set to Dog->new.
>
> Well, I think the actual method name would be CREATE. So you could have
> either a new(), or a CREATE(), or both. Use whichever one you want, no
> sweat.
>
> The default core CREATE would simply instantiate a variable, which would
> then get set via Dog::Dalmation->new.
But how does it *know* it wants Dog::Dalmation->new when it's only
declared to be a Dog? Does the word 'Polymorphism' ring any bells with
you?
--
Piers