Thread OO-Vererbung für Plugins
(49 answers)
Opened by marky at 2012-11-27 11:08 Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 package plugin; our @ISA; sub SAVE { print join(',',@ISA)."\n"; print "SAVE von plugin\n"; } sub set_isa { my $self=shift; my $name=shift; @ISA=($name); } 1; package klasse; our @ISA; sub new { return bless {}, shift; } sub SAVE { print "SAVE von klasse\n"; } sub LOAD { print "LOAD von klasse\n"; } sub use_plugin { my $self=shift; my $name=shift; bless($self,$name); $self->set_isa(__PACKAGE__); } 1; my $klasse=klasse->new(); $klasse->use_plugin('plugin'); $klasse->SAVE; # <= das SAVE aus plugin $klasse->LOAD; # <= das LOAD aus klasse Willst du so was? Wenn ja Vorsicht. Hier werden Klassen miteinander verbunden. Das betrifft jedes davon abgeleitete Objekt. Will man das für ein Objekt spezifisch machen. Dann musst du das in einen Namensraum blessen, der nur für dieses Objekt ist: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 #!/usr/bin/perl use strict; use warnings; package plugin; our @ISA; sub SAVE { print "SAVE von plugin($_[0]->{val})\n"; } sub set_isa { my $self=shift; my $name=shift; @ISA=($name); } 1; package klasse; our @ISA; use Digest::MD5 qw(md5_hex); sub new { return bless {val=>$_[1]}, $_[0]; } sub SAVE { print "SAVE von klasse($_[0]->{val})\n"; } sub LOAD { print "LOAD von klasse($_[0]->{val})\n"; } sub use_plugin { my $self=shift; my $name=shift; my $obj_unique='plugins::'.md5_hex($self); return eval(' no strict; @'.$obj_unique.'::ISA=('.$name.','.__PACKAGE__.'); bless($self,'.$obj_unique.'); '); } 1; my $obj1=klasse->new('TEST1'); $obj1->SAVE; # <= das SAVE aus klasse $obj1->LOAD; # <= das LOAD aus klasse print "\n"; $obj1=$obj1->use_plugin('plugin'); $obj1->SAVE; # <= das SAVE aus plugin $obj1->LOAD; # <= das LOAD aus klasse print "\n###########\n\n"; my $obj2=klasse->new('TEST2'); $obj2->SAVE; # <= das SAVE aus klasse $obj2->LOAD; # <= das LOAD aus klasse print "\n"; $obj2=$obj2->use_plugin('plugin'); $obj2->SAVE; # <= das SAVE aus plugin $obj2->LOAD; # <= das LOAD aus klasse |