2011-01-12 8 views
9

Пожалуйста, обратитесь к perldoc для OOP http://perldoc.perl.org/perlobj.htmlСсылаясь SUPER на суперкласс объекта

Согласно документу: «Важно отметить, что SUPER относится к суперкласса (ов) текущего пакета и не к суперкласс (ы) объекта. "

Теперь я в ситуации, когда мне нужен SUPER, чтобы ссылаться на суперкласс (ы) объекта.

Итак, ищем любой способ его достижения.

+0

Просьба уточнить: что уговорило вас, что вам нужно это сделать? – darch

ответ

8

Это довольно редко, что вам действительно нужно что-то делать, как правило, это знак того, что вы дергаетесь внутри объекта таким образом, чтобы вернуться, чтобы укусить вас позже. Если это действительно то, что нужно сделать, вы можете изменить свой пакет только для вызова метода, чтобы изменить то, что видит SUPER, или переопределить метод, вызывая полное имя метода.

{ 
    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(); 

уборщик вариант реорганизовать свои методы, так что вы можете получить доступ как базовый класс и методы подклассов, не пытаясь разрушить систему объекта.

{ 
    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(); 

Или укажите способ вызова метода базового класса.

{ 
    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(); 
    } 
    sub bar { 
     my $self = shift; 
     $self->SUPER::foo(); 
    } 
} 

my $obj = SubClass->new(); 
$obj->foo(); 
$obj->bar(); 

Лучший ответ действительно зависит от того, что вы на самом деле пытаетесь сделать, почему это требует, чтобы работать вокруг стандартного наследования.

3

Учитывая структуру классов как

package BaseClass; 
sub some_method { ... } 
... 

package SubClass; 
our @ISA = qw(BaseClass); 
sub some_method { ... } 
... 

и код, как

package MainPackage; 
our @ISA = qw(SuperPackage); 
my $object = new SubClass(...); 

вы хотите вызвать BaseClass::some_method на объекте. Внутри корпуса SubClass вы можете позвонить по телефону $object->SUPER::some_method(...). Но действительно ли вы внутри SubClass пакета, вы всегда можете явно вызвать метод, который вы хотите, как

BaseClass::some_method($object, ...) 
+0

Не могли бы вы предложить мне, как я могу вызвать some_method() в BaseClass, используя $ object внутри пакета MainPackage. – rpg

+0

Точно так же, как я написал: 'BaseClass :: some_method ($ object)' или 'BaseClass :: some_method ($ object, @other_args)'. Конструкция 'object-> METHOD' Perl - это просто синтаксический сахар для вызова' ObjectClass :: METHOD ($ object) 'где' ObjectClass' является ссылочным типом '$ object'. – mob

+0

Пожалуйста, не рекомендуем прямую манипуляцию '@ ISA'. – darch

Смежные вопросы