C# 无通道的上浇铸场
如何访问上浇铸对象中的字段?我无法使用Console.WriteLine打印C# 无通道的上浇铸场,c#,oop,object,field,upcasting,C#,Oop,Object,Field,Upcasting,如何访问上浇铸对象中的字段?我无法使用Console.WriteLine打印Guy对象的SuperPower属性 namespace Test { class Guy { public int Power { get; set; } } class BigGuy : Guy { public int SuperPower { get; set; } } class Program {
Guy
对象的SuperPower
属性
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
字段?在访问biggay
类的字段之前,您必须将guy
转换为biggay
:
Console.WriteLine(((BigGuy)guy).SuperPower);
因为变量的类型是
Guy
。这意味着您只能访问Guy
类型上声明的属性
想象一下,如果您有第二个子类:
class FastGuy : Guy
{
public int SpeedPower { get; set; }
}
guy = bigGuy;
guy = new FastGuy();
您可以访问的属性将根据您指定的值而变化。这意味着它不能在编译时进行类型检查
通常,将一个类型声明为某种不太具体的类型的意义在于,这样您就可以像处理该类型一样处理对象,即使具体类型可能是一个子类。好的,我有点理解,但为什么会有额外的括号,我的意思是为什么控制台.WriteLine((biggay)guy.SuperPower);也不起作用吗?
(biggay)guy.SuperPower
与(biggay)(guy.SuperPower)
@K.Zoyar需要额外的括号,否则您将尝试将guy.SuperPower
的值转换为classSuperGuy
而不是转换guy
对象哦,我明白了,谢谢!好的,我不知道您可以通过指定不同的值来更改访问权限,谢谢!