Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Method not found error when inheriting abstract method in Perl OOP

I have a subclass that calls a method from a superclass. The method in the superclass uses a method that is defined in the superclass as abstract (not really abstract) but implemented in the subclass.

For example:

package BaseClass;

sub new
{

}
sub method1 {

    return someAbstractMethod();
}



sub someAbtsractMethod
{
     die "oops, this is an abstract method that should " . 
         "be implemented in a subclass" ;
}
1;

package SubClass;

sub new
{

}

sub someAbtsractMethod
{
     print "now we implement the asbtract method";
}
1;

Now when I do:

$sub = new SubClass();
$sub->method1();

...it calls the abstract message and I get the specified error message. If I took off the abstract method from the super class and just leave the implementation in the subclass, It does not recognize the method and I get subroutine abstract method not found error.

like image 672
Sam Avatar asked Dec 29 '25 19:12

Sam


1 Answers

You haven't set up an IS_A relationship between the parent and child classes.

You can do this with the base pragma as Ivan suggests, or you can manipulate the @ISA array. Or you can use the parent pragma.

@ISA:

package SubClass;
our @ISA = qw( BaseClass );

parent:

package SubClass;
use parent qw( BaseClass );

By the way, don't use the indirect object syntax ever. To call your constructor do:

my $foo = SubClass->new();

Also, it looks like you aren't using the strict and warnings pragmas. Do so. Always.

Finally, if you have multiple packages in one file, it is helpful to enclose each package in a block.

Check out perlboot and perltoot, they are handy OOP tutorials in the perldoc.

Update:

I just noticed that your method calls are broken. You need to find the invoking class or instance in each method.

package BaseClass;

sub new { bless {}, shift; }  # horrible constructor - do not reuse.

sub abstract { die "The present situation is abstract"; }

sub method { my $self = shift; $self->abstract; }


package SubClass;

our @ISA = qw( BaseClass );

sub abstract { print "It's alive\n" );

In the script:

my $obj = SubClass->new;
$obj->method;

my $base = BaseClass->new;
$base->method;

Definitely read the tutorials I linked to. They will help you.

like image 77
daotoad Avatar answered Jan 01 '26 11:01

daotoad



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!