我想我在某处读到某些模块只有面向对象的接口(虽然它们没有创建对象,但它们只保存了实用程序功能).有没有意义呢?
首先,重要的是要记住,在Perl中,类是通过包以奇怪的方式实现的.包也用于一般名称空间污染预防.
package Foo;
sub new {
my ($class) = @_;
my $self = bless {}, $class;
return $self;
}
1;
Run Code Online (Sandbox Code Playgroud)
这就是你如何在Perl中创建一个Foo类(可以通过调用Foo-> new或new Foo来实例化对象).使用new只是一种惯例; 它可以是任何东西.实际上,这new就是C++所谓的静态方法调用.
您可以轻松创建仅包含静态方法调用的包,我怀疑这是您所指的.这里的优点是你仍然可以使用继承等OO功能:
package Bar;
sub DoSomething {
my ($class, $arg) = @_;
$class->Compute($arg);
}
sub Compute {
my ($class, $arg) = @_;
$arg * 2;
}
1;
package Baz;
@Baz::ISA = qw(Bar);
sub Compute {
my ($class, $arg) = @_;
$arg * 2 - 1
}
1;
Run Code Online (Sandbox Code Playgroud)
鉴于此,那么
say Bar->DoSomething(3) # 6
say Baz->DoSomething(3) # 5
Run Code Online (Sandbox Code Playgroud)
实际上,您甚至可以使用变量作为类名,因此这些变量可以像单例一样运行:
my $obj = "Baz"; # or Baz->new could just return "Baz"
print $obj->DoSomething(3) # 5
Run Code Online (Sandbox Code Playgroud)
[代码未经测试; 错别字可能存在]
我怀疑这主要是作者喜欢OO和命令式编程的哲学选择.其他人已经提到建立命名空间,但它是执行该操作的包,而不是接口.OO不是必需的.
就个人而言,我认为创建从未实例化的类(即面向对象中没有对象时)的价值很小.Perl不是Java; 你不必为一切写一个班级.一些模块承认这一点.例如:File :: Spec有一个OO接口,但也通过File :: Spec :: Functions提供了一个功能接口.
File :: Spec还提供了一个示例,其中OO 可用于未实例化的"实用程序"接口.从本质上讲,File :: Spec是一个抽象基类 - 没有实现的接口.当您加载File :: Spec时,它会检查您正在使用的操作系统并加载相应的实现.作为程序员,您可以使用界面(例如File::Spec->catfile),而无需担心catfile实际调用的是哪个版本(Unix,Windows,VMS等).