使用多态和List时访问子类成员

时间:2014-05-04 07:44:19

标签: c# list inheritance polymorphism

我有3个课程:“ChemDataChemicals (超级)”,“ ChemDataAlcohol (Sub),” ChemDataAcidBase “(Sub)和common List(类型:ChemDataChemicals)包含所有对象。我的superClass包含我的大多数字段,但子类都包含一个额外的字段--pH(十进制)和VolPercentage(十进制)。

下面的代码应该在ListBox中添加item.Name和item.VolPercentage / item.pH,但我无法访问子类中的my字段。

 foreach (ChemDataChemicals item in tmpChemDataChemicalsList)
        {
            if (item is ChemDataAlcohol)
            {

                listBox1.Items.Add(String.Format("{0}: {1}%", item.Name, (ChemDataAlcohol)item.VolPercentage));
            }

            else if (item is ChemDataAcidBase)
            {
                listBox1.Items.Add(String.Format("{0}: {1}M", item.Name, item.pH));
            }
        }

我尝试了一些铸造,但似乎没有任何效果。 (Windows窗体 - C#) 谢谢,

2 个答案:

答案 0 :(得分:2)

更改

(ChemDataAlcohol)item.VolPercentage

((ChemDataAlcohol)item).VolPercentage

另外,我建议您使用as关键字:

(item as ChemDataAlcohol).VolPercentage

因为使用第一种方法,如果转换失败,则抛出异常。使用as方法,结果为null,可以检查,避免抛出异常

答案 1 :(得分:0)

如果你有一个更普遍的问题,还有另一种方法可以从列表中访问一个子类的项目,那就是使用OfType< T>任何集合的扩展方法。

private class Chemical
{
    public string formula;
}
private class ChemDataAlcohol : Chemical
{
    public string Name;
}
private class ChemDataAcidBase : Chemical
{
    public decimal pH; // at 1.0 M
}

public static void Test()
{
    Chemical[] chemicals = {
        new Chemical { formula = "H2O" },
        new ChemDataAcidBase { formula = "H2SO4", pH = 0 },
        new ChemDataAlcohol { formula = "C2H6O", Name="ethanol" },
        new Chemical { formula = "CO2" },
        new ChemDataAcidBase { formula = "CH3COOH", pH = 2.4M },
                            };

    List<ChemDataAlcohol> alcohols = chemicals.OfType<ChemDataAlcohol>().ToList();
    foreach (ChemDataAlcohol alcohol in alcohols) { string name = alcohol.Name; }

    List<ChemDataAcidBase> acids = chemicals.OfType<ChemDataAcidBase>().ToList();
    foreach (ChemDataAcidBase acid in acids) { decimal pH = acid.pH; }
}

缺点:它并不适用于所有情况,并且需要进行一定程度的调整以满足您的问题。