2014-01-28 69 views
1

我查看了類似的線程,它們都屬於C++,所以我認爲最好是問問而不是摸索。我有,例如,此代碼:如何從基類數組中訪問派生類字段?

foo[] fooArray = new foo[5]; 
fooArray[2] = new bar(); 

都說foo是一個自定義類沒有變量/方法:

public class foo 
{ 

} 

barfoo派生的自定義類:

public class bar : foo 
{ 
    int fooBar = 0; 
} 

在我的fooArray中,我需要從fooArray[2]訪問變量fooBar,這是一個bar,但由於該變量未出現在基類中,因此它不會顯示在foo的數組中。有什麼方法可以訪問它嗎?

編輯:在應用程序代碼中,foo和bar都具有所需的構造函數和其他設置。

+0

您不能。但是,您可以將該字段推廣到基類級別狀態。 –

+2

我認爲您需要修改您的設計。如果你有幾十個派生類,每個派生類都有自己的屬性...... –

回答

0

,就可以把數組中的項目之一bar和訪問它的方式,

bar barVar = (bar)fooArray[2]; 
int fooBarInt = barVar.fooBar; 

或者使用as操作來治療對象爲bar類型,

bar barVar = fooArray[2] as bar; 
if (barVar != null) 
{ 
    // user barVar.fooBar; 
} 

但是,在您的示例fooBar中定義的方式是private。你必須在public以外的地方訪問它。

public class bar : foo 
{ 
    public int fooBar = 0; 
} 
+0

感謝您的幫助!您的解決方案完美運作另外,fooBar在我的應用程序代碼中是公開的,只是忘記輸入:) – ApachePilotMPE

0

因爲foo類沒有fooBar除非你投你的變量Bar field.You不能訪問它:

fooArray[2] = new bar(); 
var value = ((bar)fooArray[2]).fooBar; 

注:fooBar場應該是公共點域是私人默認。

+1

如果你需要這樣做,你的設計中有一些非常非常非常錯誤的東西。 –

+0

我不明白Simon:D你能否更清楚一點?在這種情況下,他應該施放它,但使用intercafe會更好。 –

+0

@SimonWhitehead您的評論確實屬於OP本身。 – rae1

0

爲了訪問它,你就需要將值轉換爲bar實例

int i = ((bar)fooArray[2]).foobar; 

注意,如果fooArray[2]實際上並不是bar一個實例這段代碼會拋出異常。如果你想這樣做,只有當fooArray[2]bar然後執行以下操作

bar b = fooArray[2] as bar; 
if (b != null) { 
    int i = b.foobar; 
    ... 
} 
1

你可以施放。爲了安全起見,您應該使用as關鍵字:

bar b = fooArray[2] as bar 
if (b != null){ 
    //Do stuff with b.foobar 
} else { 
    //Handle the case where it wasn't actually a bar 
}