为什么C#从重写属性取代重写属性的值?

问题描述:

我会怀疑下面以输出代码:为什么C#从重写属性取代重写属性的值?

(我是智能表对象,并使用在智能表的方法)的.xml

代替,但是,其输出:

(我是智能表对象并使用项的方法)的.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); 
      } 
     } 
    } 
} 

您需要的覆盖关键字添加到压倒一切的方法?

+0

谢谢,不同于PHP,:-) – 2009-06-09 13:59:10

+0

这实际上不是你的答案的100%...但它是它的一部分。 :) – 2009-06-09 14:00:08

你实际上不是压倒一切的。你在隐藏。覆盖:

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

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

如果在上面的代码中SmartForm.GetItemTypeIdCode 隐藏属性Item.GetItemTypeIdCode,被执行的属性称为“隐藏”是很奇怪的。我会认为这个“隐藏”属性不会被执行。如何调和这个术语? – 2009-06-09 14:39:46

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

检出this guide

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

在基类的属性应标明虚拟

也是在继承类的属性应标明覆盖

也是我不知道为什么在你的代码中的关键字新出现在属性定义