2013-10-15 2 views
2

Я новичок в Perl и был направлен в Moose, поскольку я пришел к источнику Perl OO, но у меня возникли проблемы с его работой. В частности, методы суперкласса, похоже, не наследуются. Чтобы проверить это, я создал три файла, которые содержат следующее:Perl, Moose - подкласс не наследует методы суперкласса

thingtest.pl

use strict; 
use warnings; 
require "thing_inherited.pm"; 
thing_inherited->hello(); 

thing.pm

package thing; 

use strict; 
use warnings; 
use Moose; 

sub hello 
{ 
    print "poo"; 
} 

sub bye 
{ 
    print "naaaa"; 
} 

1; 

И, наконец, thing_inherited.pm

package thing_inherited; 

use strict; 
use warnings; 
use Moose; 

extends "thing"; 

sub hello 
{ 
    bye(); 
} 

1; 

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

Undefined subroutine &thing_inherited::bye called at thing_inherited.pm line 11. 

Может ли кто-нибудь объяснить, если я что-то делаю не так? Благодаря!

Редактировать: При этом я столкнулся с другой загадкой: вызов метода в моем базовом классе из моего суперкласса, который должен был быть перезаписан суперклассом, не перезаписывается. Скажем, у меня был

sub whatever 
{ 

    print "ignored"; 

} 

в моем базовом классе и добавил

whatever(); 

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

ответ

8

У вас есть вызов функции, а не вызов метода. Наследование применяется только к классам и объектам, то есть к вызовам метода. Вызов метода выглядит как $object->method или $class->method.

sub hello 
{ 
    my ($self) = @_; 
    $self->bye(); 
} 

Кстати, require "thing_inherited.pm"; должен быть use thing_inherited;

+1

(Во время посещения одного из мест сестры SO, я получил уведомление, я получил «лося знак». Без контекста я подумал: «Что, за канадский ???») – ikegami

0

Всего несколько исправлений. вещь.pm была прекрасна, но увидеть изменения в thingtest.pl и thing_inherited.pm.

thingtest.pl: необходимо создать экземпляр объекта, прежде чем использовать его, то вы можете использовать метод

use thing_inherited; 
use strict; 
use warnings; 

my $thing = thing_inherited->new(); 
$thing->hello(); 

thing_inherited.pm: так как метод привет является вызов метода в своем классе, вы должны сказать это как раз то

package thing_inherited; 
use strict; 
use warnings; 
use Moose; 

extends "thing"; 

sub hello { 
    my $self = shift; 
    $self->bye(); 
    } 

1; 

Выход:

$ Perl thingtest.pl

naaaa $

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