2010-06-30 30 views
1

一個簡單的問題投對象...如何從一個數組

我有一個抽象類,細胞和兩個類BorderCell和BoardCell,從細胞類繼承。然後我有一個Cell []類型的Cells數組,其中包含BorderCell和BoardCell類型的對象。

abstract class Cell 
{ 
} 
class BorderCell : Cell 
{ 
    public void Method1(){}; 
} 
class BoardCell: Cell 
{ 
    public void Method2(){}; 
} 

... 

Cell[] Cells = new Cell[x]; 
for (int i = 0; i < x; i++){ 
    Cells[i] = new BorderCell(); 
    // or 
    Cells[i] = new BoardCell(); 
} 

現在我想將電池轉換爲BorderCell和運行其方法1,像這樣:

(Border)Cells[i].Method1(); 

但是,這是不行的,我必須使用:

BorderCell borderCell = (BorderCell)Cells[i]; 
borderCell.Method1(); 

這是唯一(和正確的方式)做到這一點)?

+1

我會在這裏回顧一下你的設計 - 不得不拋棄到派生類是一種糟糕的設計氣味 - 如果你將它們保存在同一個集合中作爲基類型,我期望它們是真正的多態(Liskov原理)。 – 2010-06-30 09:32:17

+0

Herbie博士:我很樂意提供建議,查看此主題:http://stackoverflow.com/questions/3140281/what-data-structure-to-use-in-my-example – sventevit 2010-06-30 09:47:54

回答

7

沒有,你只需要支架讓你想投適用於清楚什麼:「」

((Border)Cells[i]).Method1(); 

基本上結合比鑄鐵更嚴格,所以你的原始代碼:

(Border)Cells[i].Method1(); 

等同於:

(Border) (Cells[i].Method1()); 
+0

Jon今天很快就觸發了(照常)! – Noldorin 2010-06-30 09:28:33

+0

我知道我錯過了一些明顯的... – sventevit 2010-06-30 09:52:02

4

嘗試:

((BorderCell)Cells[i]).Method1(); 

括號,如果你用的鑄造用它們提供類型界限。你的第一次嘗試沒有包裝Cell [i]。

3

當你寫

(BorderCell)Cells[i].method1(); 

投適用於表達Cells[i].method1();,這顯然不會因爲Cells[i]工作仍然返回Cell

如果你想騰出一個額外的變量,然後寫:

((BorderCell)Cells[i]).method1(); 
2

既然你把2種(BorderCell和BoardCell)的細胞在數組中。我建議在投射前先檢查類型。

if (Cells[i] is BorderCell) 
{ 
// cast to BorderCell 
} 
else 
{ 
// cast to BoardCell 
} 
+0

這取決於。如果代碼知道應該在哪裏存在BorderCells,那麼有信心的是,如果它是錯誤的類型,那就表示一個bug,那麼演員陣容是正確的做法。 – 2010-06-30 09:37:55

+0

誠然,商業邏輯堅持認爲,如果一個單元格處於特定的位置,那麼它應該有正確的類型。請參閱:http://stackoverflow.com/questions/3140281/what-data-structure-to-use-in-my-example – sventevit 2010-06-30 09:49:42