【发布时间】:2011-01-23 14:48:56
【问题描述】:
在以下示例中,我可以在 inherited 类中创建 virtual 方法 Show(),然后在 override strong>继承类。
我想用受保护的类变量 prefix 做同样的事情,但我得到了错误:
修饰符“虚拟”无效 对于这个项目
但由于我无法在我的类中将此变量定义为 virtual/override,因此我得到了编译器 warning:
TestOverride234355.SecondaryTransaction.prefix' 隐藏继承的成员 'TestOverride234355.Transaction.prefix'。 如果 hidden 是,则使用 new 关键字 有意的。
幸运的是,当我添加 new 关键字时,一切工作正常,这没关系,因为我获得了相同的功能,但这提出了两个问题:
为什么我可以对方法使用虚拟/覆盖,但不能对受保护的类变量使用?
-
虚拟/覆盖方法和 hide-it-with-new 方法之间实际上有什么区别,因为至少在这个示例中它们提供了相同的功能?
代码:
using System;
namespace TestOverride234355
{
public class Program
{
static void Main(string[] args)
{
Transaction st1 = new Transaction { Name = "name1", State = "state1" };
SecondaryTransaction st2 =
new SecondaryTransaction { Name = "name1", State = "state1" };
Console.WriteLine(st1.Show());
Console.WriteLine(st2.Show());
Console.ReadLine();
}
}
public class Transaction
{
public string Name { get; set; }
public string State { get; set; }
protected string prefix = "Primary";
public virtual string Show()
{
return String.Format("{0}: {1}, {2}", prefix, Name, State);
}
}
public class SecondaryTransaction : Transaction
{
protected new string prefix = "Secondary";
public override string Show()
{
return String.Format("{0}: {1}, {2}", prefix, Name, State);
}
}
}
【问题讨论】:
-
您的问题涉及变量,但标题涉及属性。这些是非常不同的事情。我建议您编辑问题或(更有可能)标题。
标签: c# oop virtual overriding new-operator