Perl 何时以及为什么要使用没有数据成员的类?

Perl 何时以及为什么要使用没有数据成员的类?,perl,class,methods,module,Perl,Class,Methods,Module,我注意到一些Perl模块使用基于类的结构,但不管理任何数据。该类仅用于访问其中的方法,仅此而已 考虑以下示例: Class.pm package Class; use Moose; sub do_something { print "Hi!\n"; } 1; package Module; use strict; use warnings; sub do_something { print "Hi!\n"; } 1; test.pl use Class; # I

我注意到一些Perl模块使用基于类的结构,但不管理任何数据。该类仅用于访问其中的方法,仅此而已

考虑以下示例:

Class.pm

package Class;

use Moose;

sub do_something {
    print "Hi!\n";
}

1;
package Module;

use strict;
use warnings;

sub do_something {
    print "Hi!\n";
}

1;
test.pl

use Class;

# Instantiate an object from the class
my $obj = Class->new();

$obj->do_something();
use Module;

Module::do_something();
在本例中,您可以看到您将首先实例化该类的一个实例,然后从创建的对象调用该方法


可以实现相同的最终结果,如下所示:

模块.pm

package Class;

use Moose;

sub do_something {
    print "Hi!\n";
}

1;
package Module;

use strict;
use warnings;

sub do_something {
    print "Hi!\n";
}

1;
test.pl

use Class;

# Instantiate an object from the class
my $obj = Class->new();

$obj->do_something();
use Module;

Module::do_something();
我想知道为什么人们使用第一种方法编写模块,以及它是否提供了一些好处。对我来说,它似乎增加了一个额外的步骤,因为为了使用这些方法,首先需要实例化类的一个对象


我不明白为什么人们会这样编程,除非它有一些我没有看到的好处。

一个好处是继承。如果现有类支持
->
风格的子例程调用,则可以对其行为进行子类化(正如我在上面的评论中所说,这比说该类是面向对象的要弱)



这种技术的一个突出用途是
通用
类,所有受祝福的引用都隐式引用子类。
UNIVERSAL
命名空间中定义的方法通常将包名作为第一个参数(或将第一个参数中的引用解析为其包名),并返回一些包信息。
DB
类也做了类似的事情(尽管
DB
包也维护了大量的状态)。

我可以想到几个原因,但是如果您给出这些Perl模块中的一个示例,它会更有用;首先想到的是
CGI
模块,但经过仔细研究,它在某些情况下似乎确实存储了数据。一个好处是继承。只有当
模块的子类是面向对象的时,才能使用它。@mob,实际上这在技术上可能是不正确的。我在翻阅我的Perl库目录,它看起来像是
DB
模块在技术上不面向对象的情况下有效地使用了继承。但这很奇怪,你可以在运行时添加属性(除非类是可变的)。例如,见。很有可能想到用例。