我对术语有问题。根据MSDN:“重写修饰符扩展基类方法,新修饰符隐藏它。”但是,在以下示例中:
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隐藏了基类方法,而在本例中,基类方法显然是在使用new时调用的方法呢?
我理解不同的行为(与覆盖相比是新的),但不理解术语。
方法对基类隐藏方法是什么意思?
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");
}
}
想象一下,如果您已经写了以下内容:
var dc = new DerivedClass();
dc.Method1();
编译并运行此代码,然后调用派生方法。但是现在,删除
null
public void Method1() // 1
public new void Method1() // 2
public virtual void Method1() // 3
null
null
版本3重写了同名的方法,并且如果一个方法是虚的,那么将调用实际的方法,无论变量是如何声明的。因此,如果变量声明为
详细信息:
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/new-modifier
请注意,
BaseClass bd = new DerivedClass();
这是一个不同的