2016-11-24 3 views
3

У меня вопрос, связанный с многоуровневым наследованием в Perl.многоуровневое наследование в Perl

Вот мой код

mod.pm

package first; 

sub disp { 
    print "INSIDE FIRST\n"; 
} 

package second; 
@ISA = qw(first); 

sub disp { 
    print "INSIDE SECOND\n"; 
} 

package third; 
@ISA = qw(second); 

sub new { 
    $class = shift; 
    $ref = {}; 
    bless $ref, $class; 
    return $ref; 
} 

sub show { 
    $self = shift; 
    print "INSIDE THIRD\n"; 
} 

1; 

prog.pl

use mod; 

$obj = third->new(); 
$obj->show(); 
$obj->disp(); 

У меня есть .pm файл, который содержит три класса. Я хочу получить доступ к методу disp в первом классе, используя объект третьего класса. Я не уверен, как это может сработать.

я попытался получить доступ с помощью двух способов:

  1. используя имя класса => первый :: DISP()
  2. с использованием SUPER внутри второго пакета метода DISP => $ self-> SUPER :: DISP ();

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

+0

Зачем вам это нужно? – simbabque

ответ

3

Если вам нужно это сделать, вы неправильно определили свои классы.

Класс third наследуется от класса second. second имеет собственное определение disp, поэтому он никогда не пытается наследовать этот метод из своего суперкласса first. Это означает, что third получает реализацию, определенную в second

Простым ответом было бы позвонить first::disp что-то еще. Таким образом second не будет иметь определение метода и наследование будет вызываться снова

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

Пожалуйста, обратите внимание, что пакеты и модуль файлы должны начинаться с заглавной буквы, а каждый класс обычно в файле самостоятельно, так что вы обычно используете package First в First.pm и т.д.

+0

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

+1

@ s.patra: Я понимаю это, но вы можете объяснить * почему *. Являются ли эти пакеты тем, что вы написали, или вы получили их из других мест? Это поможет, если я смогу увидеть реальный код. – Borodin

+0

Я хочу реализовать эту концепцию в своих рамках, что невозможно будет опубликовать здесь. Поэтому я просто написал образец кода, чтобы проверить, как он работает. –

5

$obj->first::disp(), но то, что вы просить сделать то, что вы абсолютно не должны делать. Исправьте свой дизайн.

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