1

我有一个基类,它用一个复杂的数据结构实例化,该结构具有三位数的条目,所有这些都是常量。其中一些常量是特定于类的,应该用不同的常量实例化。我很难做到这一点。归结为:

tstbase.pm:

package tstbase;

my $THISCLASSCONSTANT = "baseconstant.2";
my %complexdatastructure = (
    "attribute.1" => "baseconstant.1",
    "attribute.2" => $THISCLASSCONSTANT,
);

sub new {
    my $class = shift;
    my $self = { };
    bless ($self, $class);
    $self->_init( $THISCLASSCONSTANT );
    return $self;
};

sub _init {
    my $self = shift;
    $THISCLASSCONSTANT = shift;
    foreach (keys %complexdatastructure) {
        $self->{$_} = $complexdatastructure{$_};
    };
};

tstsubclass.pm:

package tstsubclass;

use parent "tstbase";
my $THISCLASSCONSTANT = "subclassconstant.2";

sub _init {
    my $self = shift;
    $self->SUPER::_init( $THISCLASSCONSTANT );
};

tst.pl:

#!/usr/bin/perl

use tstbase;
use tstsubclass;

my $baseobj = tstbase->new;
print "Testbase ".$baseobj->{"attribute.1"}." ".$baseobj->{"attribute.2"}."\n";

my $subobj = tstsubclass->new;
print "Testsubclass ".$subobj->{"attribute.1"}." ".$subobj->{"attribute.2"}."\n";

现在的输出是

Testbase baseconstant.1 baseconstant.2
Testsubclass baseconstant.1 baseconstant.2

而我希望它是

Testbase baseconstant.1 baseconstant.2
Testsubclass baseconstant.1 subclassconstant.2

那可能吗?我很高兴使用

sub THISCLASSCONSTANT = { "subclassconstant.2" }

如果有帮助。tstsubclass 不应有任何基本常量值。现在我用魔术字符串实例化这个类并进行搜索和替换。它有效,但似乎不那么优雅和高性能。

任何帮助是极大的赞赏。我之前曾问过这个问题(Perl:使用通用构造函数进行基类和子类),但过度简化了示例,因此响应只能暗示可能的解决方案。

谢谢,马库斯

4

1 回答 1

0

最简单的方法是使用%complexdatastructure. 但请注意,这样做时,$THISCLASSCONSTANT将在第一次调用后更改为tstsubclass->new.

package tstbase;

my $THISCLASSCONSTANT = "baseconstant.2";
my %complexdatastructure = (
    "attribute.1" => \ "baseconstant.1",
    "attribute.2" => \ $THISCLASSCONSTANT,
);

sub new {
    my $class = shift;
    my $self = { };
    bless ($self, $class);
    $self->_init( $THISCLASSCONSTANT );
    return $self;
};

sub _init {
    my $self = shift;
    $THISCLASSCONSTANT = shift;
    foreach (keys %complexdatastructure) {
        $self->{$_} = ${$complexdatastructure{$_}};
    };
};

现在您的输出是所需的输出,但是如果您像这样更改新调用的顺序:

my $subobj = tstsubclass->new;
print "Testsubclass ".$subobj->{"attribute.1"}." ".$subobj->{"attribute.2"}."\n";

my $baseobj = tstbase->new;
print "Testbase ".$baseobj->{"attribute.1"}." ".$baseobj->{"attribute.2"}."\n";

你会得到:

Testsubclass baseconstant.1 subclassconstant.2
Testbase baseconstant.1 subclassconstant.2

你现在可以做的是写你的“自己的”小东西local(我不知道为什么local即使改变$THISCLASSCONSTANTto的声明也不能正常工作our

将您的更改tstbase::_init为:

sub _init {
    my $self = shift;
    my $oldconstant = $THISCLASSCONSTANT;
    $THISCLASSCONSTANT = shift;
    foreach (keys %complexdatastructure) {
        $self->{$_} = ${$complexdatastructure{$_}};
    };
    $THISCLASSCONSTANT = $oldconstant;
};

现在我认为你有你想要的。

于 2013-10-15T17:12:02.313 回答