小编Car*_*ash的帖子

处理在 Perl 中共享公共“祖先”的模块的多重继承的正确方法是什么?

(当然,Moose/Moo 的答案是“角色”。这个问题是关于一般情况,假设没有 Moose/Moo,你想要组合两个模块,它们都是同一个父类的子类。)

让我们举一个稍微做作的例子:模块LWP::UserAgent::DeterminedLWP::RobotUA都是它的子类,LWP::UserAgent并以不同的方式扩展它。如果我想创建一个结合了两者方法的对象,我该怎么办?它的核心仍然是一个LWP::UserAgent对象,另外两个模块不会相互冲突,所以应该很容易,对吧?

据我所知,正确的做法是创建一个新包,将另外两个包声明为父包use parent qw(LWP::RobotUA LWP::UserAgent::Determined)——然后从中创建对象。事实上,如果你这样做,你会得到一个对象,其中包含来自两者的方法,以及来自基类的方法LWP::UserAgent几乎所有的东西都像你期望的那样工作。

但不完全是。双方LWP::UserAgent::DeterminedLWP::RobotUA有当,如果没有其他的值被赋予创建对象设置某些属性的默认值。将两者结合起来时,LWP::RobotUA会设置 的默认值,但不会 设置LWP::UserAgent::Determined。所以一定是出了什么问题。

下面是一些测试代码:

#!/usr/bin/env perl

use strict;
use warnings;
use 5.016;

use LWP::RobotUA;
use LWP::UserAgent::Determined;

package MyUA;
use parent qw(LWP::RobotUA LWP::UserAgent::Determined);

for my $module (qw(LWP::RobotUA LWP::UserAgent::Determined MyUA)) {
    say '# ', $module, ' #';
    my $ua = $module->new(
                          'agent' => 'Test-UA',
                          'from'  => 'example@example.com',
                         );
    my $req = …
Run Code Online (Sandbox Code Playgroud)

oop perl lwp-useragent

4
推荐指数
1
解决办法
102
查看次数

标签 统计

lwp-useragent ×1

oop ×1

perl ×1