2009-04-09 12 views
8

私は前にこれを行っている知っているが、私は、私が思うツイストで実行の私のコンストラクタ順序を取得しています....「はこの」コンストラクタで

public class Class1 
{ 
    Class2 _class2; 

    public Class1() 
    { 
     _class2 = new Class2(this); 
    } 
} 

public class Class2 
{ 
    Class1 _parent; //corrected typo 

    public Class2(Class1 parent) 
    { 
     _parent = parent; 
    } 
} 

トラブルは常にその親であるへの参照を渡しますヌルに終わる。

これを行うには適切な方法はありますか? (多分私は風邪を持つ上で、私の遅さを非難することができます。)_parentが定義されることはありません

TYPO修正するためにEDITED

+0

おそらく "Class1 _parent;"を意味しますか? 「Class1 parent;」の代わりに? – el2iot2

+0

削除された回答にコメントがありましたので、ここで2セントを投げます。あなたは危険な芝生を歩いている。 Class1インスタンスが完全に構築されていないので、Class2コンストラクタは非常に悪いことをすることができます... Class2コンストラクタでこれを想像してください:parent.Child = this; // yikes –

+0

「自分のマシンで動作する」しかし、私はミカエルに同意します、これは建設中に避けるべき匂いです。 – AnthonyWJones

答えて

9

これを、技術的には、仕事は、あなたの変更を提供しなければなりません含まれるClass2 this.parent = parent;

ただし、これはお勧めしません。代わりにclass1の内部でclass2インスタンスを初期化することをお勧めします。 Class2のコンストラクタで何が行われているかに応じて、あなたは厄介な状況に陥る可能性があります。

class1にClass2プロパティを作成し、それを遅延初期化すると、Class1のコンストラクタが完了した後にClass2が構築されます(構築中ではなく、クラスが複雑になるとエラーが発生しにくくなります)。

+0

はプロパティです。ありがとう - それは私が過去にそれをhavneする方法です。 – kpollock

+0

ああ私 - 今日は本当に入力できません、私はできます:-) – kpollock

2
Class1 parent; 
_parent = parent; 

(実際のコードでは問題ではありません!)。あなたはそれを間違って綴りました。

10

あなたは、コードを誤って入力しているかもしれないが、私はあなたが(あなたのクラス2のコンストラクタでこの修飾子に気づく)クラス2のために、この定義をしたいと思う:

public class Class2 
{ 
    Class1 parent; 

    public Class2(Class1 parent) 
    { 
     this.parent = parent; 
    } 
} 
+0

"this"のもう一つの勝利 – annakata

+0

もしそれがタイプミスのように単純なら、コンパイルされそうにないでしょう。プロダクションコードの – AnthonyWJones

0

私はこれが古い質問ですけど、私は、私は私の2セントを投げるだろうと思って良い測定のために。 Googleが私をここに連れて来たので、ここに誰かが連れて来るかもしれない

これは明らかに循環依存のようです...互いに参照/使用する2つの独立したクラスを持つのはコードの匂いです。

オブジェクトに親子関係を持たせたい場合は、クラスのバイナリツリー実装(またはそれに類似したもの)を行うことを検討してください。あなたはクラスの継承を利用したい場合は、それを正しく使用

> Class2Class1の基底クラスであり、あなたのClass1宣言はpublic class Class1 : Class2だろう。 Class2の方法はというキーワードでClass1に記載されています。

要するに、この答えは、必要以上に混乱させるようにコンパイラと戦うのではなく、達成しようとしているものに合わせてクラスを再設計する必要があるということです。あなたがこれをテストすることになるだろうコードは、おそらくその後、絶対に無意味であるClass1ためClass2の参照への参照...のために、そのオブジェクトを照会、Class1をアップNEWINGている、特に以来

Append2:次のように意味的に

Class1を書き換えることができます。

public class Class1 
{ 
    Class2 _class2; 

    public Class1() 
     :this(new Class2(this)) 
    { 
    } 
    public Class1(Class2 class2) 
    { 
     _class2 = class2; 
    } 
} 

...それができない以外、:this(new Class2(this))は当然正しくない構文ですので。それはまさにあなたがやっていることです。しないでください。

+0

サイドノートとして:私はここにいるのは、誰かがこのパターンを使って大量のクラスを実装していて、迷惑なものに巻き戻すのは非常に面倒です。あなたがこれを読んでいるなら、OPのパターンを使わないでください。 – Izzy

関連する問題