我刚刚开始设计一个Perl类,很久以前我唯一使用OOP的经验就是使用C ++。
我需要将一些数据项作为“类变量” - 由所有实例共享。我希望在我第一次实例化一个对象之前对它们进行初始化,并且我希望发出use MyClass
的主程序能够为该初始化过程提供参数。
这是一个带有类变量的类的工作示例:
package MyClass;
use strict;
use warnings;
# class variable ('our' for package visibility)
#
our $class_variable = 3; # Would like to bind to a variable
sub new {
my $class = shift;
my $self = { };
bless $self, $class;
return $self;
}
sub method {
my $self = shift;
print "class_variable: $class_variable\n";
++$class_variable; # prove that other instances will see this change
}
这是一个演示:
#!/usr/bin/perl
use strict;
use warnings;
use MyClass;
my $foo = MyClass->new();
$foo->method(); # show the class variable, and increment it.
my $bar = MyClass->new();
$bar->method(); # this will show the incremented class variable.
主程序有没有办法为$ class_variable指定一个值?该值将在主程序的编译时知道。
答案 0 :(得分:6)
您也可以通过my
而不是our
声明变量“私有”。在这种情况下,您必须提供一个类方法来初始化它:
my $class_variable = 3;
sub initialize_variable {
my ($class, $value) = @_;
die "Ivalid value $value.\n" unless $value =~ /^[0-9]+$/;
$class_variable = $value;
}
然后在程序中:
'MyClass'->initialize_variable(42);
答案 1 :(得分:2)
$MyClass::class_variable = "some value";
答案 2 :(得分:2)
使用import设施:
package MyClass;
my $class_variable;
sub import
{
(undef, my $new_class_variable) = @_;
if (defined $class_variable and
defined $new_class_variable and
$class_variable ne $new_class_variable)
{
warn '$MyClass::class_variable redefined';
}
$class_variable = $new_class_variable if defined $new_class_variable;
}
在use模块时传递值:
use MyClass qw(42);
这不完全是惯用的Perl,但它也并不罕见。在函数中间进行的健全性检查应该会给出一个提示,说明为什么它可能不是所有情况下的最佳方法。如果MyClass只应该是顶级脚本的use
d,那么您可以强制执行该完整性检查:
caller eq 'main' or die 'MyClass can only be used from package main';
答案 3 :(得分:0)
您还可以使用Class方法:
前:
package myclass;
our $class_variable = 5;
sub myclass_method{
my ($class, $new_class_variable_value) = @_;
if( $class_variable != $new_class_variable_value )
{
## set the new value of the class/package variable
$class_variable = $new_class_variable_value;
}
}
在您的脚本中,您可以执行以下操作:
myclass::myclass_method('myclass', 7);