【问题标题】:Is the "new" keyword implicitly used in C#.net?C#.net 中是否隐式使用了“new”关键字?
【发布时间】:2014-05-03 14:45:01
【问题描述】:

拥有以下覆盖(或不覆盖)Draw 方法的类

using System;

namespace ConsoleApplication1
{
    public class Shape {
        public virtual void Draw() {
            Console.WriteLine("base     Drawing a shape");
        }
    }

    class Rectangle : Shape {
        public new virtual void Draw() {
            Console.WriteLine("new virt Drawing a rectangle");
            base.Draw();
        }
    }
    class Square : Rectangle {
        public override void Draw() {
            Console.WriteLine("new      Drawing a square");
            base.Draw();
        }
    }

    class Triangle : Shape {
        public override void Draw() {
            Console.WriteLine("override Drawing a triangle");
            base.Draw();
        }
    }
    class SuperTriangle : Triangle {
        public new void Draw() {
            Console.WriteLine("new Drawing a SuperTriangle");
            base.Draw();
        }
    }
    class DefaultTriangle : Triangle {
        public void Draw() {
            Console.WriteLine("(-)      Drawing a DefaultTriangle");
            base.Draw();
        }
    }

    class Program {
        static void Main(string[] args) {
            Console.WriteLine(@"
Rectangle       : Shape (new virtual)
Square          : Rectangle (override)

Triangle        : Shape (override)
SuperTriangle   : Triangle (new)
DefaultTriangle : Triangle (-)

");
            System.Collections.Generic.List<Shape> shapes = 
                new System.Collections.Generic.List<Shape>() {
                new Rectangle(), new Square(), 
                new Triangle(), new SuperTriangle(), new DefaultTriangle()};

            foreach (Shape s in shapes) {
                Console.WriteLine();
                Console.WriteLine("(Shape) " + s.GetType().Name);
                Console.WriteLine("________________________");
                s.Draw();
                Console.WriteLine();
            }
            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        }
    }
}

我有以下输出:

Rectangle       : Shape (new virtual)
Square          : Rectangle (override)

Triangle        : Shape (override)
SuperTriangle   : Triangle (new)
DefaultTriangle : Triangle (-)



(Shape) Rectangle
________________________
base     Drawing a shape


(Shape) Square
________________________
base     Drawing a shape


(Shape) Triangle
________________________
override Drawing a triangle
base     Drawing a shape


(Shape) SuperTriangle
________________________
override Drawing a triangle  // <<<< !!!
base     Drawing a shape


(Shape) DefaultTriangle
________________________
override Drawing a triangle  // <<<< !!!
base     Drawing a shape 

这是否意味着new keyword 不是强制性的,而是隐式应用的,如果没有指定其他关键字?

PS。警告:

警告 1 'ConsoleApplication1.DefaultTriangle.Draw()' 隐藏继承 成员'ConsoleApplication1.Triangle.Draw()'。为了使当前 成员覆盖该实现,添加 override 关键字。 否则添加 new 关键字。

【问题讨论】:

  • 是的,确实如此。很多细节here
  • @Andrei,谢谢,你能在答案中“解压”这条评论吗?! :)
  • 好的,谢谢。它可能会帮助其他可以找到这个问题的人。完成。
  • @EricLippert,也许错过了窗口?
  • @Andrei:哎呀,你是对的。我的意思是说,你提到的问题的重复:stackoverflow.com/questions/3117838

标签: c# .net oop inheritance overriding


【解决方案1】:

警告明确说明实际行为:

'method' 隐藏继承的成员'base method'

所以是的,new 行为是默认行为。如果您想了解其背后的原因,或者想了解有关整个问题的更多详细信息 - 请参阅 @EricLippert 在此 thread 中的出色回答。

【讨论】:

    【解决方案2】:

    您拥有的代码将生成专门回答您问题的警告。

    它告诉你,你没有指出该方法是否应该被覆盖或隐藏基类实现,除非另有说明,否则它会隐藏该实现。

    【讨论】:

    • 警告告诉我添加新关键字。但是我有疑问,这种修改是否会增加或不改变当前行为(没有“new”关键字)......
    • 另外,对我来说,“隐藏实现”不是很清楚,不仅仅是“new”关键字可以与“override”一起使用......
    • new 关键字隐藏了底层实现,这意味着任何override 都将覆盖new virtual 而不是virtual 更高的链。有点像断点。
    • 感谢大卫和塞尔维。然而,问题是显式 new 是否等同于在函数名之前不指定任何关键字。
    猜你喜欢
    • 1970-01-01
    • 2019-07-26
    • 2012-01-20
    • 1970-01-01
    • 2014-10-12
    相关资源
    最近更新 更多