【问题标题】:About the new modifier in C# [duplicate]关于 C# 中的 new 修饰符 [重复]
【发布时间】:2014-01-23 17:43:08
【问题描述】:

我不太明白 C# 中的修饰符new:根据new 修饰符的存在,以下代码有何不同?

class A 
    {
        public void F() { Console.WriteLine("A::F()"); }
    }


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

    public static void Main()
    {
        A a = new B();
        B b = new B();
        A trueA = new A();
        a.F();
        b.F();
        trueA.F();
        Console.ReadLine();
    }
}

C++中有没有等价或类似的东西?

【问题讨论】:

  • 我想你的意思是new operator
  • @Habib 鉴于如果删除了 new 运算符,代码甚至无法编译,我认为 OP 表示 new 修饰符。
  • @p.s.w.g,我认为代码可以编译,但它只会对方法隐藏发出警告。是的,你是对的,OP 询问的是方法隐藏而不是新运算符。
  • 你问为什么a.FtrueA.F()都返回"A::F()",即使a被实例化为new B()?我不太明白这个问题。
  • 第二部分(C++ 等效于 C#“新修饰符”)在 Can you Hide a virtual method in c++ 中介绍

标签: c# operator-keyword


【解决方案1】:

如果您在类B 中使用public void F()public new void F(),结果是相同的。该方法仍将被遮蔽。

不同之处在于,如果您省略 new 修饰符,您将收到编译器警告,因为代码可能会令人困惑。 new 修饰符用于指定您实际上打算隐藏基类中的成员,而不是碰巧错误地使用了相同的名称。

【讨论】:

    【解决方案2】:

    如果您在基类中定义了 virtual 方法,您会看到差异。 override 修饰符扩展了基类方法,而 new 修饰符通过创建一个与基类上的方法无关的新方法来隐藏它。 尝试下一个代码:

    class Program
    {
     class A
     {
       public virtual void F() { Console.WriteLine("A::F()"); }
       public virtual void G() { Console.WriteLine("A::G()"); }
     }
    
    
    class B : A
    {
      public override void F() { Console.WriteLine("B::F()"); }
      public new void G() { Console.WriteLine("B::G()"); }
    
      public static void Main()
      {
        A a = new B();
        B b = new B();
        a.F();
        b.F();
        a.G();
        b.G();
    
        Console.ReadLine();
      }
    }
    

    }

    在 C++ 中,您可以通过在派生类上定义同名但参数不同的方法来隐藏基类的方法。也许你可以使用它。

    【讨论】:

      猜你喜欢
      • 2011-11-08
      • 2011-06-30
      • 1970-01-01
      • 2017-09-29
      • 1970-01-01
      • 2014-10-28
      • 2011-02-25
      • 2020-05-06
      • 2013-07-29
      相关资源
      最近更新 更多