2016-01-10 145 views
1

我有兩個類。珠寶是基礎,Ring從它繼承。c#從父類訪問子類

class Jewellery 
{ 
    public string Name { get; set; } 
    ...... 

    public Jewellery(string name) 
    { 
      Name = name; 
    } 
} 

class Ring : Jewellery 
{ 
    public string Size { get; set; } 

    public Ring(string name, string size) :base(name) 
    { 
      Size = size 
    } 
} 

現在在主要我創建珠寶清單,並在該列表中我添加了環對象。

Ring ring = new Ring("Diamond", "Very big"); 
List<Jewellery> jewellery = new List<Jewellery>(); 
jewellery.Add(ring); 

現在,當我調試時,我可以從珠寶列表中訪問戒指對象。我可以從代碼中完成嗎?我認爲應該這樣做,但這不起作用。

jewellery[0].Ring 
+0

這聽起來像是一個基本的問題。 Google虛擬方法,覆蓋和訪問者模式。 –

回答

4

你需要將其強制轉換,例如:

var myRing = (Ring)jewellery[0]; 

var maybeRing = jewellery[0] as Ring; 
if (maybeRing != null) 
{ 
// do stuff 
} 

if (jewellery[0] is Ring) 
{ 
    // Cast and do stuff 
} 

對於多種類型,你可以

if (jewellery[0] is Ring) 
{ 
    // Cast and do stuff 
} 
else if(jewllery[0] is Necklace) 
{ 
    // and so on 
} 

關於安全鑄造參見MSDN


取決於你想做的事,你可以使用LINQ按類型來過濾內容:

考慮:

List<Jewellery> things = new List<Jewllery>(); 

然後:

public IList<T> GetJewellery<T>(this jewellery) where T : Jewellery 
{ 
    return jewellery.OfType<T>().ToList(); 
} 

可以:

IList<Necklace> necklaces = things.GetJewellery<Necklace>(); 
IList<Ring> rings = things.GetJewellery<Ring>(); 
+0

但是如果我有更多的課程?然後我不知道第一個元素是什麼。例如,我有'類項鍊:珠寶',我把它添加到列表'jewellery.Add(項鍊);'。現在我想排序列表並訪問第一項。所以現在我不知道它是戒指還是項鍊。 –

+0

明白了,謝謝。 –