我怀疑下面的代码输出:
然而,(我是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);
}
}
}
}
答案 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会出现在您的代码中的属性定义
中