从Perl中的Base类调用子类方法

时间:2010-07-22 06:42:53

标签: perl oop mason

我有一个名为Mobile::Auth的模块来授权并重定向到登录页面。我希望在我的Site::Auth中访问Mobile::Auth中的所有方法,但方法redirect_to_login_page除外,我有Mobile::Auth特定方法。

我做了这样的事......

package Mobile:Auth;
use base Site::Auth;

sub redirect_to_login_page{
  #get_my_mobile_specific
}
1;

在我的Mason组件文件中我放了..

use Mobile::Auth;
Mobile::Auth::authorize($args);

以下是我Site::Auth的样子

package Site::Auth;

....

   sub authorize {
     #.....
     if (!$authorize) {
       redirect_to_login_page($args);
     }
    }
    sub redirect_to_login_page{ 
     # redirect to the login page  
    }
    1;

授权有效,但我的问题是,当我从authorize调用Mobile::Auth方法时,它应调用Site::Auth::authorization方法而Mobile::Auth::redirect_to_login_page代替Site::Auth::redirect_to_login_page

伙计们,任何人都可以告诉我如何做到这一点。提前谢谢。

2 个答案:

答案 0 :(得分:2)

Mobile :: Auth没有授权子。

Mobile::Auth::authorize($args)
鉴于你所展示的,

应该死。

正如Daxim指出的那样,你没有使用方法语法,因此没有调用perl的方法调度。您有两种方法可以解决此问题。

第一种方法是调用你真正想要的那个,即

Site::Auth::authorize($args)

接着是

Mobile::Auth::redirect_to_login_page

但是,如果您正在尝试执行此操作,我认为您可以尝试使用包方法(这种方法不如对象方法常见,但至少是正确的):

package Site::Auth;
#....
sub authorize {
    my ( $self, @args ) = @_;

    my $authorized = $self->validate_credentials(@args);

    if( !$authorized ) {
        $self->redirect_to_login_page(@args);
    }
}
sub redirect_to_login_page{ 
    my ( $self, @args ) = @_;
 # redirect to the login page 
}
sub validate_credentials {
    my ( $self, @args ) = @_;
    # This is what you had in #..... before
    return $authorized
}
1;

package Mobile:Auth;
use base 'Site::Auth';

sub redirect_to_login_page {
    my ( $self, @args ) = @_;
    #...
}
1;

### in Mason
use Mobile::Auth;
Mobile::Auth->authorize($args);

请注意一些变化:Site :: Auth :: authorize()现在希望$ self成为第一个参数,而Mobile :: Auth现在使用 - >调用authorize。 operator,这是方法调用语法。 ::和 - >之间的区别这里很大。首先,当您使用 - >调用函数时,我们将其称为“方法”而不是“子”。其次,该方法总是作为第一个参数传递“$ self”。对于package方法,$ self只是一个包含包名称的字符串。对于对象,$ self是对象的引用。第三,使用您在此处尝试使用的OO层次结构调度方法。

现在您将注意到Mobile :: Authorize定义了自己的redirect_to_login_page(),但没有定义validate_credentials()或authorize()子。 (严格地说,你不必为后面的内容分解validate_credentials(),但是你应该这样做,所以我做了。)

它是如何工作的? Mobile :: Auth-> authorize()向上传播,直到找到Site :: Auth->授权,然后调用它。 Site :: Auth-> authorize将$ self称为“Mobile :: Auth”。它调用Mobile :: Auth-> validate_credentials,perl最终将调度为Site :: Auth-> validate_credentials。然后它调用Mobile :: Auth-> redirect_to_login_page,它实际上是在Mobile :: Auth包中定义的,所以它从那里被调用。

此外,您确实需要阅读http://perldoc.perl.org/perlobj.html封面封面。这应该为您提供perl中对象的基础知识。

答案 1 :(得分:1)

一个问题是你需要引用父类:

use base 'Site::Auth';

如果您有use strict;,那么您的代码就会出错:)

BTW ...你在标签中提到Moose但代码示例没有使用它。

/ I3az /