2014-10-20 236 views
1

我目前正在擴展一個其他人正在工作的項目,並且我一直在嘗試獲取受保護變量的信息。我已經嘗試了幾件事,但變量總是空。受保護的訪問

public class AController : Controller 
{ 
    Protected Login _login {get; set;} 
} 
public class BController : AController 
{ 
    _login = login; 
} 
public class CController : AController 
{ 
    if(_login != null) 
    {  
    } 
} 

這是我認爲它會工作的方式。我知道我不能做CController : BController,因爲它受到保護。是否有另一種方法可以將信息從BController中提取到CController。

+0

如果代碼編譯並且您訪問值但爲空,表示在訪問值之前尚未設置該值。如果你需要在課堂以外訪問它,只要有可能,就將其標記爲公共,如果沒有,則可以通過骯髒的反射方式訪問它。 – 2014-10-20 11:09:03

+0

這段代碼不能編譯。什麼是登錄(沒有下劃線)?然而,一個受保護的成員在所有後代中都是可見的,所以你應該能夠從CController訪問_login ... btw .:受保護的可能會寫成小寫? – HimBromBeere 2014-10-20 11:09:32

+0

您的代碼不會被編譯。我想你錯過了這些陳述的一些方法和/或構造函數。請添加足夠的代碼以使代碼正確。 – 2014-10-20 11:13:20

回答

3

所以你有BController的實例和CController的實例,它們都繼承了AController。所以當你創建它們時,它們是兩個不同的實例,並且它們中的每一個都有自己的_login變量,更改一個變量將不會改變另一個變量,除非該變量是靜態的並且跨實例共享。

你應該使用靜態關鍵字上AController的屬性_login來實現你想要的結果。

然而,正確的解決方案是將login作爲構造函數參數傳遞給BController和CController構造函數,以便它們共享相同的登錄實例。

如果這些控制器是MVC控制器,爲什麼你需要在相同的請求上實例化它們?

+0

謝謝,靜態做了詭計,就像我說我沒有寫這段代碼,我只是在CController中擴展了一些代碼。但是這些控制器是網站上不同模塊的一部分,唯一相同的就是稍後添加到其他方法的登錄。示例BModule(_login,OtherClass) – ZozV 2014-10-20 11:58:27

0

我不確定我在說什麼,但要訪問這些數據,您的對象是否需要從您的超類繼承?