2

私は Perl で多くのクラスを使用/作成してきましたが、それらで行う必要がある一般的なことの 1 つは、親オブジェクトの特定のプロパティにアクセスすることです。たとえば、Class_A と Class_B があり、これらは次のように単純であるとします。

Class_A.pm

package Class_A;
use strict;
use warnings;

sub new {
    my $class = shift;
    my $this = {
        history_data => [],
    };
    bless $this, $class;
}

Class_B.pm

package Class_B;
use strict;
use warnings;

sub new {
    my $class = shift;
    my $this = {
        history_data => [],
    };
    bless $this, $class;
}

Class_A はuseClass_B になり、プロパティとしてインスタンスを作成できます。どちらもプロパティhistory_dataを持っていますが、Class_B が Class_A のインスタンスによって作成されたインスタンスである場合、Class_B をhitory_dataその親オブジェクトで使用したいと考えています。

したがって、私がこれまで行ってきたことは、次のように、子インスタンスを作成するときに参照を渡すことだけです。

#!/usr/bin/perl
use strict;
use warnings;
use Class_A;
use Class_B;

my $class_a = new Class_A;

$class_a->{instance_of_B} = new Class_B parent => $class_a;

私はそれを非常に単純にしていますが、Class_B を使用する必要がある場合、そのインスタンスは Class_A 内の何らかのメソッドによって作成できます。ここで重要なのは、Class_B には独自のプロパティがありますが、親である場合は Class_A のプロパティを使用することです。

それはうまくいきますが、親参照を子に渡さずにそれを行う方法が存在するかどうか、何度か疑問に思いました。親オブジェクトを呼び出す Perl で既に実装されている方法のようなものです。

それで、それは私の質問です。参照を直接受け取らずに、Class_B がその親 Class_A のインスタンスにアクセスする方法はありますか?

ありがとう。:-)

編集:それを置く別の方法はこれです:

参照を渡さずに Class_B が「私は現在 Class_B のインスタンスであり、Class_A のプロパティに住んでおり、現在独自のプロパティに x、y、および z の値がある」と言う方法はありますか?

4

3 に答える 3

1

ここのどこかに設計上の問題があるようです。ただし、Aspect::Library::Wormholeが役立つかどうかを確認してください。

正確な状況によっては、Beam::Wireなどの依存性注入フレームワークを使用すると役立つ場合があります。

アップデート

私は以下のコードを「良い」解決策や「良い」慣行として提唱しているわけではありませんが、次の方法Wormholeが役立つ場合があります。

package A;
use strict; use warnings;

sub new {
    my $class = shift;
    bless {
        b => undef,
        history_data => [],
    } => $class;
}

sub set_b {
    my $self = shift;
    $self->{b} = B->new;
    return $self->{b};
}

package B;

use strict; use warnings;

sub new {
    my $class = shift;
    my $owner = shift;
    bless {
        history_data => $owner->{history_data} // [],
    } => $class;
}

sub add_event {
    my $self = shift;
    push @{ $self->{history_data} }, [ @_ ];
    return;
}

package main;

use strict; use warnings;
use Aspect;
use YAML;

aspect Wormhole => 'A::add_b', 'B::new';

my $x = A->new;
my $y = $x->set_b;

$y->add_event(Horizon => 180, 0, 'Terminal');

print Dump $x;
print Dump $y;
于 2013-04-02T17:28:51.727 に答える