Es ist ziemlich selten, dass Sie wirklich so etwas tun müssen, normalerweise ist es ein Zeichen, dass Sie sich in einem Objekt auf eine Art und Weise mucken, die später wieder beißen wird. Wenn es wirklich so ist, was getan werden muss, können Sie Ihr Paket nur für den Methodenaufruf ändern, um SUPER zu ändern, oder die Methode überschreiben, indem Sie den vollständigen Methodennamen aufrufen.
{
package BaseClass;
sub new { bless \my $self, shift; }
sub foo {
my $self = shift;
print "BaseClass::foo()\n";
}
}
{
package SubClass;
our @ISA = qw(BaseClass);
sub foo {
my $self = shift;
print "SubClass::foo()\n";
$self->SUPER::foo();
}
}
{
package ParentClass;
sub new { bless \my $self, shift; }
sub bar {
my $self = shift;
print "ParentClass::bar()\n";
}
}
{
package ChildClass;
our @ISA = qw(ParentClass);
sub foo {
my $other = SubClass->new();
print "ChildClass::foo()\n";
# fails trying to find ParentClass::foo()
eval { $other->SUPER::foo(); } or warn [email protected];
# thinks this is SubClass and finds BaseClass::foo()
{ package SubClass; $other->SUPER::foo(); }
# if you know the correct class that SUPER::foo() would have called (but this will also work if it was the wrong class)
$other->BaseClass::foo();
}
sub bar {
my $self = shift;
print "ChildClass::bar()\n";
$self->SUPER::bar();
}
}
my $obj_1 = SubClass->new();
$obj_1->foo();
my $obj_2 = ChildClass->new();
$obj_2->bar();
$obj_2->foo();
Eine sauberere Option ist für Ihre Methoden, Refactoring, so dass Sie ohne zu versuchen, sowohl die Basisklasse und Unterklasse Methoden zugreifen können das Objekt System zu unterminieren.
{
package BaseClass;
sub new { bless \my $self, shift; }
sub foo {
my $self = shift;
print "BaseClass::foo()\n";
}
}
{
package SubClass;
our @ISA = qw(BaseClass);
sub bar {
my $self = shift;
print "SubClass::bar()\n";
$self->SUPER::foo();
}
}
my $obj = SubClass->new();
$obj->foo();
$obj->bar();
Oder bieten Sie eine Methode an, um die Basisklassenmethode aufzurufen.
Die beste Antwort hängt wirklich davon ab, was Sie wirklich versuchen, zu tun, warum das erfordert, dass Sie Standardvererbung umgehen.
Bitte klären Sie: Was hat Sie davon überzeugt, dass Sie dies können müssen? – darch