Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?
 
PerlMonks  

Re^2: How to use Inheritance with Inside-Out Classes and Hash Based Classes

by Perl Mouse (Chaplain)
on Nov 16, 2005 at 09:53 UTC ( #508957=note: print w/ replies, xml ) Need Help??


in reply to Re: How to use Inheritance with Inside-Out Classes and Hash Based Classes
in thread How to use Inheritance with Inside-Out Classes and Hash Based Classes

You just hit the problem with inheritance - you're extending the class, which means you're tied to its implementation details.
With traditional, hash-based objects, you are right. And that's true for most of the implementations based on a Class::* module of CPAN, including Class::Std as well. And even the new inside out based class being promoted here on Perlmonks last week.

But the pure, not on a module depending, inside-out technique deals with inheritance perfectly. It can inherit from any implementation - and if inherited from, the inheritee can use whatever implementation it wants as well. Of course, if A inherits from B, B inherits from C, and B is using an inside-out technique, but A and C don't, C might still dictate how A is implemented.

#!/usr/bin/perl use strict; use warnings; package HashBased; sub new { my $class = shift; return bless {@_}, $class; } sub noise { my $self = shift; printf "The %s goes %s!\n", $self->{name}, $self->{sound} } sub name { my $self = shift; return $self->{name}; } package InsideOut; { use Scalar::Util 'refaddr'; my %legs; our @ISA = 'HashBased'; sub new { my $class = shift; my $legs = pop; my $obj = bless $class->SUPER::new(@_), $class; $legs{refaddr $obj} = $legs; return $obj; } sub show_legs { my $self = shift; printf "The %s has %d legs\n", $self->name, $legs{refaddr $sel +f}; } sub DESTROY { my $self = shift; delete $legs{$self} } } package main; my $dog = InsideOut->new(name => 'dog', sound => 'bark', 4); my $bird = InsideOut->new(name => 'bird', sound => 'peep', 2); $dog->noise; $dog->show_legs; $bird->noise; $bird->show_legs; __END__ The dog goes bark! The dog has 4 legs The bird goes peep! The bird has 2 legs
As you can see, the super class is using hash-based objects. But that doesn't prevent an inside-out based class to inherit from it. And you could even inherit from that class and use a hash-based implementation if you want to do so.
Perl --((8:>*


Comment on Re^2: How to use Inheritance with Inside-Out Classes and Hash Based Classes
Download Code

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others musing on the Monastery: (14)
As of 2015-07-07 18:16 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (93 votes), past polls