-1

私には3つのクラスがあり、それらの間に循環参照があります。

class A 
{
    public A()
    {
        B obj = new B();
    }
}
class B
{
    public B()
    {
        C obj = new C();
    }
}
class C
{
    public C()
    {
        A obj = new A();
    }
}

のオブジェクトを作成するとA、例外がスローされます。
相互に参照するクラスインスタンスを作成するにはどうすればよいですか?

4

5 に答える 5

5

Aのオブジェクトを作成しているとき、例外がスローされます

そうですね、そうでしょう。作成Aすると、新しいBものが作成され、新しいものが作成され、新しいものが作成CされますA

循環参照を解決するにはどうすればよいですか。

Cおそらく、コンストラクターにオリジナルについて知ってもらいたいAですか?その場合、2つのオプションがあります。

  • 3つすべてを個別に作成してから、お互いについて説明します。これには、タイプが変更可能である必要があります。
  • コンストラクターからthisコンストラクターに渡し、次にコンストラクターからコンストラクターに渡します。これは、のコンストラクターをエスケープできるという点で厄介であり、非常に慎重に行う必要があります。(初期化が完了する前に、インスタンスのメソッドを呼び出さないでください。)ABBCthisABC
于 2012-07-19T11:29:00.977 に答える
4

あなたはこれを行うことができます:

class A 
{
    public B b;

    public A()
    {
        this.b = new B(new C(this));
    }
}
class B
{
    public C c;
    public B(C c)
    {
        this.c = c;       
    }
}
class C
{
    public A a;
    public C(A a)
    {
        this.a = a;
    }
}
于 2012-07-19T11:29:29.663 に答える
2

オブジェクトを遅延してロードすることもできます。そうすれば、それらは実際にはすぐに構築されず、構築の循環ループに入ることはなく、実際に必要なときに構築されます。

Lazy<T>MSDNの記事にあるC#の実装、またはにアクセスして構築することでプロパティget{ }に関連するものを使用してみることができます。

于 2012-07-19T11:36:27.837 に答える
2

それでもうまくいく最も簡単な方法は、クラスAのパブリックインターフェイスを定義するインターフェイスIAを作成することです。次に、クラスAにインターフェイスIAを実装させます。次に、Aのインスタンスを作成してIAを返すことができるファクトリクラスを追加します。このように、クラスCはクラスAについて知る必要がなく、循環参照は壊れています。

于 2012-07-19T11:31:07.517 に答える
0

uがA、B、またはCのコンストラクターを呼び出すと、常に例外が発生します。コンストラクターにパラメーターを渡すことで解決できるかもしれませんが、この構造で何をしたいのか疑問に思っています。教えてもらえますか?

于 2012-07-19T11:29:07.080 に答える