这是情景:
class BaseClass
{
public virtual string Prop {get; set;}
}
class ChildClass : BaseClass
{
public override string Prop {get; set;}
}
//program
...
ChildClass instance = new ChildClass;
Console.WriteLine(instance.Prop); //accessing ChildClass.Prop
...
问题是如何在ChildClass的实例中访问BaseClass.Prop?铸造会起作用吗?
Console.WriteLine((instance as BaseClass).Prop); //accessing BaseClass.Prop
CNC中 很多人建议铸造。在C ++中,它不起作用,因为多态仍然可以确保调用子属性。在C#中不是这种情况吗?
在C ++中,您可以通过以下方式解决问题:
instance.(BaseClass::get_Prop())
答案 0 :(得分:3)
将子类的实例强制转换为基类的实例; I.S.使用方法:
((BaseClass)childClassInstance).Prop
答案 1 :(得分:2)
覆盖属性的语义不允许您访问被覆盖属性的基础。这是有道理的。使用ChildClass的类不应该关心属性是否被覆盖。当该属性被另一个类使用时,由ChildClass返回适当的值。
通常这些问题表明试图解决不同的问题。您需要直接访问基本属性时面临哪些问题?
答案 2 :(得分:1)
您是否收到该代码的编译错误?
在任何情况下,ChildClass.Prop都不会覆盖BaseClass.Prop - 它会隐藏它。你应该把它声明为
public new string Prop {get; set;}
您可以通过base.Member
访问基类中的任何成员。在这种情况下,base.Prop
。
答案 3 :(得分:1)
Console.WriteLine(((BaseClass)instance).Prop); //BaseClass.Prop
这是有效的,因为属性没有被覆盖,它被隐藏了。如果您将“override
”关键字添加到派生类属性中,它将不再有效。
答案 4 :(得分:1)
BaseClass baseInstance = instance as BaseClass;
Console.WriteLine(baseInstance .Prop); //accessing BaseClass.Prop
答案 5 :(得分:0)
您的ChildClass的Prop属性隐藏了BaseClass的Prop属性。这应该是编译器警告。
编辑: 你必须决定你想要的行为,多态性或新的属性声明,因为c#允许这两种行为。
答案 6 :(得分:0)
使用new
关键字和conversion
一起使用
,例如public new string Prop { [...] }
和Console.WriteLine((instance as BaseClass).Prop);
答案 7 :(得分:-2)
就像任何基本成员一样:base.Prop