2012-11-10 2 views
-1

Ниже приведен минимизированы пример, где у меня есть OA.pm (родительский объект), OB.pm дочерний объект, а второе место сценарий:СУПЕР неопределен, когда я множественное наследование

О.Б. объекта:

package OB; 

use OA; 
require Exporter; 
@ISA = (Exporter, OA); 
@EXPORT =(); 

sub new { 
    my $class = shift; 

    print $class->SUPER; 
    bless {}, $class; 
}; 

1; 
О.

Объект:

package OA; 

require Exporter; 
@ISA = (Exporter); 
@EXPORT =(); 

sub new { 
    bless {}, shift; 
}; 

1; 

И бегун:

#!/usr/bin/perl 

use strict; 
use warnings; 
use OB; 

print OB->new; 

Когда я бегу, я получил:

Can't locate object method "SUPER" via package "OB" at OB.pm line 10.

1) Что может быть не так?

2) И что бы СУПЕР указал на то, что у меня есть более одного родителя?

3) Был ли use OA обязательным?

+0

Обратите внимание, что вам не нужно наследовать от Экспортера. Вам просто нужно использовать Exporter qw (import); ' – ikegami

ответ

3

В отличие от Ruby, вы должны явно указать весь метод, о котором вы говорите.

print $class->SUPER::new; 

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

Если у вашего класса более одного родителя, множественного наследования, Perl обычно просматривает родителей глубина сначала для соответствующего метода. Это часто проблематично, и вы можете переключиться на C3 method resolution order (mro) с use mro "c3", который позволяет избежать diamond inheritance problem.

More information on how SUPER and multiple inheritance.

И, наконец, use OA или require OA был обязательным для загрузки класса OA. Вы можете загрузить и наследовать из класса в одной строке, используя use parent "OA".

+0

Привет, я только что обновил свой вопрос, я разделил его на три части, вы можете проверить его? (Второй и третий) – daisy

+0

Получил и обновил. Что вы намеревались получить от 'print $ class-> SUPER'? – Schwern

+0

Ничего, я пытался создать действительно сведенный к минимуму пример ... поскольку perl обычно просто печатает адрес памяти, просто чтобы убедиться, что он работает – daisy

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