提问者:小点点

为什么new隐藏基类方法?


我对术语有问题。根据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时调用的方法呢?

我理解不同的行为(与覆盖相比是新的),但不理解术语。


共2个答案

匿名用户

方法对基类隐藏方法是什么意思?

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重写了同名的方法,并且如果一个方法是虚的,那么将调用实际的方法,无论变量是如何声明的。因此,如果变量声明为,但实际上类是,那么将调用Derivate's方法。

详细信息:

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/new-modifier

请注意,使用与您所理解的不同:

BaseClass bd = new DerivedClass();

这是一个不同的,而不是声明修饰符。