2009-04-09 63 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從未定義

編輯以錯字

+0

你可能是指「Class1 _parent」嗎?而不是「Class1家長」? – el2iot2 2009-04-09 15:29:43

+0

我對已刪除的答案發表了評論,所以我會在這裏投入2美分。你踩着危險的草坪。由於Class1實例沒有完全構造,所以Class2構造函數可以做一些非常糟糕的事情......想象一下在Class2構造函數中:parent.Child = this; // yikes – 2009-04-09 15:35:32

+0

「適用於我的機器」。不過,我同意邁克爾的觀點,在施工過程中使用這種氣味是需要避免的。 – AnthonyWJones 2009-04-09 15:40:04

回答

9

這應該在技術上,工作,只要你改變要包括的類2 this.parent = parent;

但是,我不建議這樣做。相反,我會推薦在class1中懶惰地初始化你的class2實例。根據Class2的構造函數中所做的所有操作,您可能會導致自己陷入令人討厭的情況。

在class1上創建一個Class2屬性並對其進行延遲初始化會導致Class2在Class1的構造函數完成後構建,而不是在構造過程中構建,如果類變得更加複雜,這很可能不太容易出錯。

2
Class1 parent; 
_parent = parent; 

(這是不是在真正的代碼問題!);你拼錯了。

10

你可能已經輸入了錯誤的代碼,但我想你想這個定義爲Class2中(請注意您的Class2的構造函數的預選賽):

public class Class2 
{ 
    Class1 parent; 

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

「this」的另一個勝利 – annakata 2009-04-09 15:30:17

0

我知道這是一個老問題,但我想我會扔我的兩分錢中好的措施。 Google把我帶到了這裏,所以它可能會把別人帶到這裏。

這可疑看起來像一個循環依賴...它是相當的代碼氣味有兩個獨立的類使用/互相引用。

如果您想要有對象的父/子關係,請考慮爲您的類製作二叉樹實現(或類似)。

如果你想利用類繼承,使用正確> Class2是一個基類爲Class1和你Class1聲明將public class Class1 : Class2。您可以使用base關鍵字參考Class2Class1中的方法。

簡而言之,這個答案是:你需要重新設計你的類,以更好地適應你想要完成的事情,而不是與編譯器做一些比它需要更困惑的事情。

特別是由於代碼你要與被測試這可能是newing了Class1,然後查詢該對象的引用Class2的參考爲Class1 ...這是絕對沒有意義的。

Append2:

語義,Class1可以改寫如下:

public class Class1 
{ 
    Class2 _class2; 

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

...但它不能,因爲:this(new Class2(this))是理所當然的語法不正確。這也正是你在做什麼。請不要。

相關問題