为什么C#从重写属性而不是重写属性获取值?

为什么C#从重写属性而不是重写属性获取值?,c#,oop,inheritance,C#,Oop,Inheritance,我怀疑下面的代码无法输出: (我是一个SmartForm对象,使用SmartForm中的方法) 然而,它却输出: (我是一个SmartForm对象,使用项中的方法)。xml 为什么?如何强制C#从重写属性获取值?这就是我重写该属性的原因 using System; namespace TestInhersdk234 { public class Program { static void Main(string[] args) {

我怀疑下面的代码无法输出:

(我是一个SmartForm对象,使用SmartForm中的方法)

然而,它却输出:

(我是一个SmartForm对象,使用项中的方法)。xml

为什么?如何强制C#从重写属性获取值?这就是我重写该属性的原因

using System;

namespace TestInhersdk234
{
    public class Program
    {
        static void Main(string[] args)
        {
            SmartForm smartForm = new SmartForm();
            Console.ReadLine();
        }
    }

    public class SmartForm : Item
    {
        public SmartForm()
        {
            Console.WriteLine(FullXmlDataStorePathAndFileName);
        }

        public new string GetItemTypeIdCode
        {
            get
            {
                return String.Format("(I am a {0} object and using the method in SmartForm)", this.GetType().Name);
            }
        }
    }

    public class Item
    {
        public string FullXmlDataStorePathAndFileName
        {
            get
            {
                return GetItemTypeIdCode + ".xml";
            }
        }

        public string GetItemTypeIdCode
        {
            get
            {
                return String.Format("(I am a {0} object and using the method in Item)", this.GetType().Name);
            }
        }
    }
}

您需要将override关键字添加到覆盖方法中?

您实际上没有覆盖。你躲起来了。要覆盖:

class MyBase
{
    public virtual void foo() {}
}

class MyClass : MyBase
{
    public override void foo() {}
}

要覆盖的项目属性未标记为
virtual
。因此,当您在SmartForm中重新定义它们时,您只是在“隐藏”它们,而不是实际覆盖它们。(此外,您还需要SmartForm中的
override
关键字。)


签出。

GetItemTypeIdCode不是虚拟的;你不是在覆盖它,你只是在隐藏它。在这种情况下,执行哪个方法不是基于对象的动态类型,而是基于对象引用的静态类型。在FullXmlDataStorePathAndFileName中,“this”的静态类型是Item,而不是SmartForm,因此调用GetItemTypeIdCode的Item实现。

基类中的属性应标记为virtual

此外,继承类中的属性也应标记为重写


此外,我不知道为什么属性定义中的代码中会出现关键字new(新建)

这实际上并不是100%的答案。。。但这是其中的一部分派生类中的属性或方法的新特性是一种向C#编译器指示您实际上打算隐藏父方法/prop,而不是重写它的方式。IIRC,它会压缩编译器关于这样做的警告。然而,我已经很久没有真正需要隐藏(vs覆盖)了,所以我可能有点生疏了。:)如果在上述代码中SmartForm.GetItemTypeIdCode隐藏了属性Item.GetItemTypeIdCode,那么执行的属性被称为“hidden”是很奇怪的。我认为“隐藏”的财产不会被执行。如何协调这个术语?您将原始功能隐藏在新类中,并用其他内容替换它。但是,在本例中,您是从基类调用原始函数。在这种情况下,您肯定要覆盖。