Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是",;新";在C#.net中隐式使用的关键字?_C#_.net_Oop_Inheritance_Overriding - Fatal编程技术网

是",;新";在C#.net中隐式使用的关键字?

是",;新";在C#.net中隐式使用的关键字?,c#,.net,oop,inheritance,overriding,C#,.net,Oop,Inheritance,Overriding,具有以下类,该类重写(或不重写)Draw方法 using System; namespace ConsoleApplication1 { public class Shape { public virtual void Draw() { Console.WriteLine("base Drawing a shape"); } } class Rectangle : Shape { publ

具有以下类,该类重写(或不重写)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();
        }
    }
}
使用系统;
命名空间控制台应用程序1
{
公共阶级形态{
公共虚拟空间绘制(){
控制台。WriteLine(“绘制形状的基础”);
}
}
类矩形:形状{
公开新的虚拟抽空(){
WriteLine(“新的virt绘制矩形”);
base.Draw();
}
}
类正方形:矩形{
公共覆盖无效绘图(){
控制台。WriteLine(“新绘制正方形”);
base.Draw();
}
}
类三角形:形状{
公共覆盖无效绘图(){
Console.WriteLine(“覆盖绘制三角形”);
base.Draw();
}
}
类超三角形:三角形{
公开新提款(){
Console.WriteLine(“新绘制超三角形”);
base.Draw();
}
}
类DefaultTriangle:Triangle{
公众抽签(){
Console.WriteLine((-)绘制默认三角形);
base.Draw();
}
}
班级计划{
静态void Main(字符串[]参数){
Console.WriteLine(@)
矩形:形状(新虚拟)
正方形:矩形(替代)
三角形:形状(替代)
超级三角形:三角形(新)
默认三角形:三角形(-)
");
System.Collections.Generic.List形状=
新的System.Collections.Generic.List(){
新矩形(),新正方形(),
新建三角形(),新建超级三角形(),新建DefaultTriangle()};
foreach(形状中的形状s){
Console.WriteLine();
Console.WriteLine(“(Shape)”+s.GetType().Name);
Console.WriteLine(“uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu”);
s、 Draw();
Console.WriteLine();
}
控制台。WriteLine(“按任意键退出”);
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
行为是默认行为。如果你想知道其背后的原因,或者想了解整个问题的更多细节,请参阅本文中的伟大答案。

是的,确实如此。大量细节@Andrei,谢谢,你能在回答中“解开”这条评论吗?!:)当然,谢谢。这可能会帮助其他能够找到这个问题的人。完成了。@EricLippert,可能错过了窗户?@Andrei:哎呀,你说得对。我的意思是,重复你提到的问题:警告告诉我添加新的关键字。然而,我有疑问,这种修改是否会增加当前行为的变化(没有“new”关键字)……而且,对于我来说,还不是很清楚therm“隐藏一个实现”,而不仅仅是“new”关键字可以与“override”关键字一起使用……
new
关键字隐藏底层实现,这意味着任何
覆盖
都会覆盖
新的虚拟
,而不是链上更高的
虚拟
。就像是一个转折点。谢谢大卫和塞维。然而,问题是显式的
new
是否等同于在函数名之前不指定任何关键字。