【发布时间】:2018-01-29 12:01:53
【问题描述】:
我对术语有疑问。根据 MSDN:“override 修饰符扩展了基类方法,而 new 修饰符隐藏了它。” 但是,在以下示例中:
using System;
namespace ConsoleApplication2
{
class BaseClass
{
public virtual void Method1()
{
Console.WriteLine("Base - Method1");
}
}
class DerivedClass : BaseClass
{
public void Method1() // DerivedClass.Method1() hides inherited memeber BaseClass.Method1(). Use the new keyword if hiding was intended.
{
Console.WriteLine("Derived - Method1");
}
}
class Program
{
static void Main(string[] args)
{
BaseClass bd = new DerivedClass();
bd.Method1();
Console.ReadLine();
}
}
}
你会看到,如果你在DerivedClass中声明Method1()时使用new,bd.Method1()会按照基类的指示输出:“Base - Method1”。
...然而,如果您在 DerivedClass 中声明 Method1() 时使用 override,则 bd.Method1() 将按照派生类中的说明输出:“Derived - Method1”。
为什么每个来源(包括官方文档)都说 new 隐藏 base 类方法,而在这个例子中,base类方法是使用new时调用的方法吗?
我了解不同的行为(新行为与覆盖相比),但不了解术语。
【问题讨论】:
-
检查一下,docs.microsoft.com/en-us/dotnet/csharp/programming-guide/…,因为
hiding,new应该在方法定义中。 -
它将它隐藏在 DerivedClass(以及它的任何后代)中。它不会将其隐藏在 BaseClass 中。所以是的,它确实隐藏了基类方法,但这并不意味着你显然认为它会这样做。也请参阅我的答案。
-
new对您的输出没有任何作用。它只会抑制警告。这只是术语,在 VB 中等效的关键字是Hides。
标签: c#