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

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

Действительно ли это возможно в 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();
6
задан brian d foy 21 February 2010 в 23:37
поделиться

2 ответа

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

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

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

4
ответ дан 17 December 2019 в 00:08
поделиться

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

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 для более подробной информации.

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

3
ответ дан 17 December 2019 в 00:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: