gpt4 book ai didi

perl - 什么时候以及为什么要使用没有数据成员的类?

转载 作者:行者123 更新时间:2023-12-02 20:41:28 26 4
gpt4 key购买 nike

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

考虑以下示例:

Class.pm

package Class;

use Moose;

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

1;

test.pl

use Class;

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

$obj->do_something();

在此示例中,您可以看到首先实例化类的实例,然后从创建的对象中调用方法。


可以像这样实现相同的最终结果:

模块.pm

package Module;

use strict;
use warnings;

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

1;

test.pl

use Module;

Module::do_something();

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

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

最佳答案

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

package Class;
sub new { bless \__PACKAGE__,__PACKAGE__ }
sub do_something { "foo" }
sub do_something_else { 42 }
1;


package Subclass;
@Sublcass::ISA = qw(Class);
sub new { bless \__PACKAGE__,__PACKAGE__ }
sub do_something_else { 19 }


package main;
use feature 'say';
$o1 = Class->new;
$o2 = Subclass->new;

say $o1->do_something; # foo
say $o2->do_something; # foo
say $o1->do_something_else; # 42
say $o2->do_something_else; # 19

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

关于perl - 什么时候以及为什么要使用没有数据成员的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46714114/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com