2014-04-02 31 views
0

夥計們我不確定我是否錯過了任何重要的OOP概念,請指導我如果我錯過了某些內容。 我有一個基類和一些繼承類如下將繼承的項目添加到同一列表容器中

Class Shape {} 
Class Arc:Shape{} 
Class Line:Shape{} 

現在我想提出的所有產生的形狀的容器(目錄),然後當我讀回我會投的對象,使某些類型。什麼是最好的辦法做到這一點。泛型是唯一的方式,如下所示?請幫助

SortedList shapeList; 
public int addShapes(Shape item) {shapeList.Add(ItemID, item);} 
+0

通用容器的點和OOP是,你不因爲對象的行爲根據實際的類而改變,即使通過基類引用調用,也不需要將對象強制轉換。 – nvoigt

+1

「泛型是我在下面顯示的唯一方式」 - 您沒有顯示任何對泛型的使用。請注意'SortedList <,>'也是一個鍵/值映射,如果你只是想要一個列表,爲什麼不使用'List '? –

+1

您的容器應該是'List '或另一個已經存在的通用容器。 – nvoigt

回答

2

你可以把你所有的Shape實例在List<Shape>

var list = new List<Shape>(); 
list.Add(new Arc()); 
list.Add(new Line()); 
list.Add(new Arc()); 
list.Add(new Arc()); 
list.Add(new Line()); 

要獲取所有Arc情況下,你可以這樣做:

var arcs = list.OfType<Arc>(); 

同樣,對於全部Line實例:

var lines = list.OfType<Line>(); 
1

你的對象添加到List<Shape>

var list = new List<Shape>(); 
list.Add(new Arc()); 
list.add(new Line()); 
list.Add(new Arc()); 

,然後使用LINQ查詢原始列表和檢索您的對象:

var arcList = list.Where(x => x.GetType() == typeof(Arc)).ToList(); 
+0

+0像。馬克的答案中的'.OfType'有什麼問題? –

+0

@RubenBartelink起初,我沒有注意到在相關的MSDN文檔中的方法OfType()。這是我不知道的。我想馬克提出的是做同樣的工作,比較我的LINQ查詢。我認爲我是一個有效的選擇。 –

+0

雖然這是一個非常好的答案,但它是在第一個答案中添加的,並且在任何有用的方式中都沒有區別。我個人會刪除答案或編輯它以實際添加對話有用的內容。對我而言,'.OfType'是一個好得多的默認值(與〜=一樣),而不是進行精確的類型檢查。除非你認爲這與OP的問題真正相關,否則作爲壞建議的組合也會成爲重複*幾乎*推動我到-1。 –