2012-11-21 55 views
0

循環因此,例如,我有兩個類:C#力繼承類通過列表

Class A 
{ 
    string property1; 
    string property2; 
} 

Class B : A 
{ 
    string property3; 
    string property4; 
    .... 
} 

於是產生了B繼承類A的屬性。他們坐在一個列表,即坐在字典

Dictionary <string, List<A>> myDictionary = new Dictionary<string, List<A>>(); 

List<A> myList = new List<A>(); 

有一個字典,包含許多列表的,所有包含類&乙對象的組合。 循環播放時,我試圖從B類對象訪問一些屬性,我有一條if語句來查找它們,但程序仍然認爲它們是A類類型,並在嘗試使用property3或property4時引發錯誤。例如:

string key = string key in dictionary; 
string index = object position in list; 

myDictionary[key][index].property3.someMethod(); 

有一種方法告訴程序,這是一個B類對象和允許使用3 & 4的屬性?

+1

如果您不得不從基礎轉換爲派生,您可能需要重新考慮您的算法。這有時是必要的,但它是一種代碼味道(是的,我討厭這個詞,但它適用於這裏)。 – siride

+1

是的,已經很臭了,只要你開始給B添加功能,或者本尊冒犯從A和B派生的C和D,成熟,真正成熟。看看其他方式,也許是聚合,然後再越過不歸路。 –

+0

我不知道我明白你的意思。如果不打算向繼承類添加屬性,那麼使用繼承的意義何在? – Pry

回答

5

安全地轉換對象爲B類對象,然後檢查空

var obj = myDictionary[key][index]; 

var bObj = obj as B; 
if (bObj != null) 
{ 
    bObj.someMethod(); 
} 

雖然,我也可能會說,好像你的設計是關閉的。通常情況下,我不希望這樣的事情。通常,如果你使用繼承,你會想要一個允許它們交替使用的設計。例如,您可能將A上的行爲視爲無操作,但在B上覆蓋它以實際執行某些操作。這將使得消費類不需要關心「A」事實上是A還是B實例。

+0

非常感謝你,我知道你的設計意思,但這是第一個想到的,但不幸的是這是大學課程,這些是我們給的課程。謝謝 – Pry