首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Perl中从基类调用子类方法

在Perl中从基类调用子类方法
EN

Stack Overflow用户
提问于 2010-07-22 14:42:53
回答 2查看 1.4K关注 0票数 1

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

我做了这样的事情...

代码语言:javascript
复制
package Mobile:Auth;
use base Site::Auth;

sub redirect_to_login_page{
  #get_my_mobile_specific
}
1;

在我的Mason组件文件中,我放入..

代码语言:javascript
复制
use Mobile::Auth;
Mobile::Auth::authorize($args);

下面是我的Site::Auth的样子

代码语言:javascript
复制
package Site::Auth;

....

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

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

伙计们,任何人都能告诉我怎么做。提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2010-07-22 20:45:30

Mobile::Auth没有授权sub。

代码语言:javascript
复制
Mobile::Auth::authorize($args)

会死的,考虑到你所展示的。

正如Daxim所指出的,您没有使用方法语法,因此没有调用perl的方法分派。您有两个选项来解决这个问题。

第一种方法是调用您实际需要的sub,即

代码语言:javascript
复制
Site::Auth::authorize($args)

紧接着是

代码语言:javascript
复制
Mobile::Auth::redirect_to_login_page

然而,如果你正在尝试做这个OO,你可以尝试打包方法(它不像对象方法那么常见,但至少是正确的):

代码语言:javascript
复制
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,这是方法调用语法。这里的::和->之间的差别很大。首先,当你用->调用一个函数时,我们称它为“方法”而不是"sub“。其次,始终将"$self“作为第一个参数传递给该方法。对于包方法,$self只是一个包含包名称的字符串。对于对象,$self是对该对象的引用。第三,使用您在这里尝试使用的OO层次结构来分派方法。

现在您会注意到,Mobile::Authorize定义了自己的redirect_to_login_page(),但没有定义validate_credentials()或authorize()子函数。(严格地说,您不必将validate_credentials()排除在后面,但是您应该这样做,所以我就这样做了。)

它怎麽工作?Mobile::Auth->authorize()沿着链向上移动,直到找到Site::Auth->authorize,然后调用它。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中的对象有基本的了解。

票数 2
EN

Stack Overflow用户

发布于 2010-07-22 16:34:55

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

代码语言:javascript
复制
use base 'Site::Auth';

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

顺便说一句。您在标记中提到了Moose,但是代码示例没有使用它。

/I3az/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3306366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档