Я хотел бы заменить родительскую функцию (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();
Когда вы вызываете Test2-> Main ()
, имя пакета передается в качестве первого параметра вызываемой функции. . Вы можете использовать параметр для адресации нужной функции.
sub Main
{
my ($class) = @_;
$class->SomeFunc() or die "Somefunc returned 0";
}
В этом примере $ class
будет «Test2»
, поэтому вы вызовете Test2-> SomeFunc ()
. Еще лучшим решением было бы использовать экземпляры (например, благословить
объект в Test :: new
, использовать $ self
вместо $ class
]). А еще лучше было бы использовать Moose
, который решает множество проблем объектно-ориентированного программирования на Perl.
Чтобы наследование работало, вам нужно вызывать ваши функции как методы, либо на классе, либо на объекте, используя оператор ->
. Похоже, вы поняли это для вызова 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 для более подробной информации.
Также не ставьте паренсы после имен подпрограмм при их объявлении - это делает не то, что вы думаете.