Beefy Boxes and Bandwidth Generously Provided by pair Networks
Don't ask to ask, just ask
 
PerlMonks  

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

by dragonchild (Archbishop)
on Nov 15, 2005 at 17:23 UTC ( #508702=note: print w/ replies, xml ) Need Help??


in reply to 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.

You might want to look at delegation. Basically, you would contain a File::Samba object and you forward any method you don't override to it. Take a look at Tree::Compat for an example.


My criteria for good software:
  1. Does it work?
  2. Can someone else come in, make a change, and be reasonably certain no bugs were introduced?


Comment on Re: How to use Inheritance with Inside-Out Classes and Hash Based Classes
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
    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:>*

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others rifling through the Monastery: (5)
As of 2014-07-25 02:55 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My favorite superfluous repetitious redundant duplicative phrase is:









    Results (167 votes), past polls