2016-01-10 10 views
1

У меня есть два класса. Украшения - основа, и Кольцо наследует от нее.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 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

Но если у меня больше классов? И тогда я не знаю, что такое первый элемент. Например, у меня есть 'class Necklace: Jewellery', и я добавляю его в список' jewellery.Add (necklace); '. И теперь я хочу отсортировать список и получить доступ к первому элементу. Так что теперь я не знаю, кольцо или ожерелье. –

+0

Получил, спасибо. –