c从父类访问子类

本文关键字:子类 访问 父类 | 更新日期: 2023-09-27 18:29:52

我有两个类。珠宝是基础,戒指从中继承。

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

c从父类访问子类

您需要对其进行强制转换,例如:

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();
}

Can:

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