Как я могу переопределить родительскую функцию класса дочерней в Perl? - PullRequest
6 голосов
/ 21 февраля 2010

Я хотел бы заменить родительскую функцию (Somefunc) в дочернем классе, поэтому, когда я вызываю процедуру Main, она должна завершиться с ошибкой.

Возможно ли это в Perl?

Код:

package Test;

use strict;
use warnings;

sub Main()
{
    SomeFunc() or die "Somefunc returned 0";
}

sub SomeFunc()
{
    return 1;
}

package Test2;

use strict;
use warnings;

our @ISA = ("Test");

sub SomeFunc()
{
    return 0;
}

package main;

Test2->Main();

Ответы [ 2 ]

4 голосов
/ 21 февраля 2010

Когда вы вызываете Test2->Main(), имя пакета передается в качестве первого параметра вызываемой функции. Вы можете использовать этот параметр для обращения к нужной функции.

sub Main
{
    my ($class) = @_;
    $class->SomeFunc() or die "Somefunc returned 0";
}

В этом примере $class будет "Test2", поэтому вы будете звонить Test2->SomeFunc(). Еще лучшим решением было бы использовать экземпляры (то есть, bless объект в Test::new, используйте $self вместо $class). А еще лучше было бы использовать Moose, что решает множество проблем с объектно-ориентированным программированием на Perl.

3 голосов
/ 21 февраля 2010

Чтобы наследование работало, вам нужно вызывать свои функции как методы класса или объекта с помощью оператора ->. Вы, кажется, поняли это для своего вызова к Test2->Main(), но все методы, которые вы хотите вести себя OO-способом, должны вызываться таким образом.

package Test;

use strict;
use warnings;

sub Main
{
    my $class = shift;
    $class->SomeFunc() or die "Somefunc returned 0";
}

sub SomeFunc
{
    return 1;
}

package Test2;

our @ISA = ("Test");

sub SomeFunc
{
    return 0;
}

package main;

Test2->Main();

См. perlboot для подробного ознакомления и perltoot для более подробной информации.

Кроме того, не ставьте скобки после имен подпрограмм, когда вы их объявляете - это не делает то, что вы думаете.

...