UpCasted字段无法访问

时间:2017-07-22 11:40:33

标签: c# oop object field upcasting

如何访问UpCasted对象中的字段?我不能使用Console.WriteLine来打印SuperPower对象的Guy属性

namespace Test
{
    class Guy
    {
        public int Power { get; set; }
    }

    class BigGuy : Guy
    {
        public int SuperPower { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Guy guy = new Guy();
            BigGuy bigGuy = new BigGuy();
            bigGuy.SuperPower = 4;
            guy = bigGuy;
            Console.WriteLine(guy.SuperPower); // Visual studio doesn't accept this line.
        }
    }
}

当我调试时,我收到一个错误:

'Guy' does not contain a definition for 'SuperPower' 

为什么我无法访问guy.SuperPower字段?

2 个答案:

答案 0 :(得分:0)

在访问guy类的字段之前,您必须将BigGuy强制转换为BigGuy

Console.WriteLine(((BigGuy)guy).SuperPower);

答案 1 :(得分:0)

因为变量的类型是Guy。这意味着您只能访问Guy类型上声明的属性。

想象一下,如果你有第二个子类:

class FastGuy : Guy
{
    public int SpeedPower { get; set; }
}

guy = bigGuy;
guy = new FastGuy();

您可以访问的属性会根据您分配的值而更改。这意味着它无法在编译时进行类型检查。

通常,将类型声明为某种不太具体的类型是这样的,即使具体类型可能是子类,您也可以对该对象进行操作,就好像它是该类型一样。