7

我有两节课

class  A
{
     public virtual void Metod1()
     {
         Console.WriteLine("A.Method1");
     }
}

class B : A
{
    public new void  Metod1()
    {
        Console.WriteLine("B.Method1");
    }
}

然后我编写了一些代码来声明这些类的实例,并调用它们的方法

     static void Main(string[] args)
    {
        A a = new B();
        a.Metod1();
        B b = new B();
        b.Metod1();
        Console.ReadKey();
    }

我给出了以下结果:

A.Method1
B.Method1

但是当我从 B 类的签名方法 1 中删除关键字 new 并运行 Main 方法时,我得到了相同的结果。问题:方法签名中的新关键字是否只是为了更好的可读性?

编辑:是否存在我们不能没有新关键字的情况?

4

3 回答 3

7

new关键字让代码阅读器知道此方法将在其基中隐藏具有相同名称的方法。即使你省略了它,编译器也会以同样的方式处理它,但会警告你。

由于您将该方法声明为virtual,因此在编译时会收到以下警告:

'B.Metod1()' 隐藏继承的成员 'A.Metod1()'。要使当前成员覆盖该实现,请添加 override 关键字。否则添加新关键字。

但是,如果您通过删除virtual来更改声明:

  • 没有虚拟输入的声明A

    class A {
        public void Metod1() {
            Console.WriteLine("A.Method1");
        }
    }
    
    class B: A {
        public void Metod1() {
            Console.WriteLine("B.Method1");
        }
    }
    

仍将编译,但警告消息将是:

'B.Metod1()' 隐藏继承的成员 'A.Metod1()'。如果要隐藏,请使用 new 关键字。

在上述任何一种方式中,以下内容:

  • 测试代码

    var b=new B();
    b.Metod1();
    (b as A).Metod1();
    

将输出:

B.方法1
A.方法1

但是,如果您声明如下:

  • 带有覆盖的声明B

    class A {
        public virtual void Metod1() {
            Console.WriteLine("A.Method1");
        }
    }
    
    class B: A {
        public override void Metod1() {
            Console.WriteLine("B.Method1");
        }
    }
    

那么输出将是:

B.方法1
B.方法1

这是因为Method1基类不仅被隐藏,而且派生类覆盖。

不能只使用new的情况是 ifMethod1是抽象类中的抽象方法:

  • 必须在派生类中使用覆盖的代码

    abstract class A {
        public abstract void Metod1();
    }
    
    class B: A {
        public override void Metod1() { // use `new` instead of `override` would not compile
            Console.WriteLine("B.Method1");
        }
    }
    

在这种情况下,您不能只使用new,因为A需要派生类来覆盖Method1

于 2013-04-04T06:30:10.810 回答
6

知道何时使用覆盖和新关键字(C# 编程指南)

在 C# 中,派生类中的方法可以与基类中的方法同名。您可以使用 new 和 override 关键字指定方法如何交互。override 修饰符扩展了基类方法,而 new 修饰符隐藏了它

通过使用 new,您断言您知道它修改的成员隐藏了从基类继承的成员

于 2013-04-04T06:28:25.787 回答
3

是的,你是对的,这是为了在这种情况下更好的可读性。

但是仔细检查你应该有一个警告,在隐藏基本方法时不要使用 new 。

你可以在这里阅读更多:http: //msdn.microsoft.com/en-us/library/vstudio/435f1dw2.aspx

于 2013-04-04T06:30:53.097 回答