在C#中访问重写的公共属性

时间:2009-06-18 17:34:50

标签: c# inheritance

这是情景:

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

8 个答案:

答案 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#允许这两种行为。

  • 使用virtual / override进行多态行为
  • 将new用于“new-but-same-name”属性行为

答案 6 :(得分:0)

使用new关键字和conversion一起使用

,例如public new string Prop { [...] }Console.WriteLine((instance as BaseClass).Prop);

答案 7 :(得分:-2)

就像任何基本成员一样:base.Prop