1

3 桁のエントリ数を持つ複雑なデータ構造でインスタンス化された基本クラスがあり、それらはすべて定数です。これらの定数のいくつかはクラス固有であり、別の定数でインスタンス化する必要があります。これを達成するのに苦労しています。要約すると、次のようになります。

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 には baseconstant 値がありません。現在、クラスを魔法の文字列でインスタンス化し、検索と置換を行っています。機能しますが、エレガントさとパフォーマンスが低下しているようです。

どんな助けでも大歓迎です。私は以前にこの質問をしたことがあります ( Perl: Using common constructor for base and subclass ) が、例を単純化しすぎたため、回答は可能な解決策を示唆するものにすぎません。

ありがとう、マーカス

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

あなたが今できることは、あなたの「独自の」小さなものを書くことです( toの宣言を変更しても、localなぜ法線が機能しないのかわかりません)local$THISCLASSCONSTANTour

あなたを次のように変更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 に答える