2010-02-21 41 views
5

我想在子类中替换父函数(Somefunc),所以当我调用Main过程时,它应该失败。如何用Perl中的子类重写父类函数?

在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(); 
+1

事实上,我真的不需要其他OO功能,如创建对象等 我只是有很多的基本代码与1或2个简单的程序来替换孩子'班'。 – Miollnyr 2010-02-21 09:22:19

回答

4

当您调用Test2->Main()时,包名将作为第一个参数传递给被调用的函数。您可以使用该参数来解决正确的功能。

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

在这个例子中,$class"Test2",所以你会打电话Test2->SomeFunc()。更好的解决方案是使用实例(即blessTest::new中的对象,使用$self而不是$class)。更好的办法是使用Moose,它解决了Perl中面向对象编程的许多问题。

+0

谢谢,它有效;) – Miollnyr 2010-02-21 09:17:24

3

为了继承工作,你需要打电话给你的功能的方法,无论是在一类或对象,通过使用->操作。你似乎已经想通了你的电话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

另外,当你声明它们时,不要把parens放在你的子程序名后 - 它不会做你的想法。

相关问题