为什么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);
}
}
}
}
您需要的覆盖关键字添加到压倒一切的方法?
你实际上不是压倒一切的。你在隐藏。覆盖:
class MyBase
{
public virtual void foo() {}
}
class MyClass : MyBase
{
public override void foo() {}
}
如果在上面的代码中SmartForm.GetItemTypeIdCode 隐藏属性Item.GetItemTypeIdCode,被执行的属性称为“隐藏”是很奇怪的。我会认为这个“隐藏”属性不会被执行。如何调和这个术语? – 2009-06-09 14:39:46
您希望覆盖的项目属性未标记为virtual
。因此,当您在SmartForm中重新定义它们时,您只是“隐藏”它们,而不是实际覆盖它们。 (此外,您还需要SmartForm中的override
关键字。)
检出this guide。
GetItemTypeIdCode不是虚拟的;你不是在压倒它,你只是隐藏它。在这种情况下,执行哪个方法不是基于对象的动态类型,而是基于对象引用的静态类型。在FullXmlDataStorePathAndFileName中,'this'的静态类型是Item,而不是SmartForm,所以调用GetItemTypeIdCode的Item实现。
在基类的属性应标明虚拟
也是在继承类的属性应标明覆盖
也是我不知道为什么在你的代码中的关键字新出现在属性定义
谢谢,不同于PHP,:-) – 2009-06-09 13:59:10
这实际上不是你的答案的100%...但它是它的一部分。 :) – 2009-06-09 14:00:08