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

时间:2009-06-09 13:55:11

标签: c# oop inheritance

我怀疑下面的代码输出:

  

(我是SmartForm对象并使用SmartForm中的方法).xml

然而,

输出:

  

(我是一个SmartForm对象并使用Item中的方法).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);
            }
        }
    }
}

5 个答案:

答案 0 :(得分:13)

你实际上并没有超越。你在躲藏。要覆盖:

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

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

答案 1 :(得分:6)

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

答案 2 :(得分:3)

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

查看this guide

答案 3 :(得分:0)

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

答案 4 :(得分:0)

基类中的属性应标记为虚拟

继承类中的属性也应标记为覆盖

我也不确定为什么关键字new会出现在您的代码中的属性定义